我有一个ASP.NET核心站点,它为大多数页面使用cookie身份验证。对于这些页面,为未授权客户端提供302重定向的默认服务器响应是可取的。但是,该网站也接受API请求;他们使用API密钥并且不能使用cookie。禁止在ASP.NET核心中的API URL上重定向
理想情况下,我想完全关闭API URL的Cookie处理,但最低限度,我需要确保如果API客户端未经授权,服务器不会响应302重定向。
我有一个ASP.NET核心站点,它为大多数页面使用cookie身份验证。对于这些页面,为未授权客户端提供302重定向的默认服务器响应是可取的。但是,该网站也接受API请求;他们使用API密钥并且不能使用cookie。禁止在ASP.NET核心中的API URL上重定向
理想情况下,我想完全关闭API URL的Cookie处理,但最低限度,我需要确保如果API客户端未经授权,服务器不会响应302重定向。
将重定向事件处理程序替换为仅在路径不是API时才使用默认行为的处理程序。在地方
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()
,而不会导致重定向:在Startup.ConfigureServices
,补充一点:
services.ConfigureApplicationCookie(options => {
options.Events.OnRedirectToAccessDenied = ReplaceRedirector(HttpStatusCode.Forbidden, options.Events.OnRedirectToAccessDenied);
options.Events.OnRedirectToLogin = ReplaceRedirector(HttpStatusCode.Unauthorized, options.Events.OnRedirectToLogin);
});
使用此辅助方法来代替重定向方法。
更新:以上是针对ASP.NET Core 2的。code for ASP.NET Core 1是不同的。
对于.NET的核心2.X这里是(根据爱德华的答案)修复:
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
:
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);
};
我更新了我的答案,包括ASP.NET核心2.我的更新,我没有取代'事件',而只是设置其相关的属性。 –