我有一个ASP.NET Core站点,它对大多数页面使用cookie身份验证 . 对于这些页面,需要为未授权客户端提供302重定向的默认服务器响应 . 但是,该站点也接受API请求;他们使用API密钥,不使用cookie .
理想情况下,我想完全关闭API URL的cookie处理,但最低限度,我需要确保如果API客户端未经授权,服务器不会响应302重定向 .
仅当路径不是API时,才将重定向事件处理程序替换为使用默认行为的处理程序 . 在 Startup.ConfigureServices 中,添加以下内容:
Startup.ConfigureServices
services.ConfigureApplicationCookie(options => { options.Events.OnRedirectToAccessDenied = ReplaceRedirector(HttpStatusCode.Forbidden, options.Events.OnRedirectToAccessDenied); options.Events.OnRedirectToLogin = ReplaceRedirector(HttpStatusCode.Unauthorized, options.Events.OnRedirectToLogin); });
使用此帮助器方法替换重定向方法:
static Func<RedirectContext<CookieAuthenticationOptions>, Task> ReplaceRedirector(HttpStatusCode statusCode, Func<RedirectContext<CookieAuthenticationOptions>, Task> existingRedirector) => context => { if (context.Request.Path.StartsWithSegments("/api")) { context.Response.StatusCode = (int)statusCode; return Task.CompletedTask; } return existingRedirector(context); };
有了这个,API控制器方法可以调用 Unauthorized() 和 Forbid() 而不会导致重定向 .
Unauthorized()
Forbid()
更新:以上是针对ASP.NET Core 2. code for ASP.NET Core 1是不同的 .
对于.net core 2.x,这是一个修复程序(根据Edward的回答):
services.ConfigureApplicationCookie(options => { options.Events = new CookieAuthenticationEvents { OnRedirectToAccessDenied = ReplaceRedirector(HttpStatusCode.Forbidden, context => options.Events.RedirectToAccessDenied(context)), OnRedirectToLogin = ReplaceRedirector(HttpStatusCode.Unauthorized, context => options.Events.RedirectToLogin(context)) }; });
哪里 ReplaceRedirector :
ReplaceRedirector
Func<RedirectContext<CookieAuthenticationOptions>, Task> ReplaceRedirector(HttpStatusCode statusCode, Func<RedirectContext<CookieAuthenticationOptions>, Task> existingRedirector) => context => { if (context.Request.Path.StartsWithSegments("/api")) { context.Response.StatusCode = (int)statusCode; return Task.CompletedTask; } return existingRedirector(context); };
2 回答
仅当路径不是API时,才将重定向事件处理程序替换为使用默认行为的处理程序 . 在
Startup.ConfigureServices
中,添加以下内容:使用此帮助器方法替换重定向方法:
有了这个,API控制器方法可以调用
Unauthorized()
和Forbid()
而不会导致重定向 .更新:以上是针对ASP.NET Core 2. code for ASP.NET Core 1是不同的 .
对于.net core 2.x,这是一个修复程序(根据Edward的回答):
哪里
ReplaceRedirector
: