在ASP.Net / ASP.Net核心WebAPI中,
当客户端/浏览器尝试访问使用 [Authorized]
属性修饰的WebAPI端点时。它会获得一个 302-Found
状态代码,其中包含对“登录”页面的重定向响应,而非 401-Unauthorized
,用于未经授权的请求。
注意:我注意到 AuthorizeAttribute 过滤器中的 Fail(AuthorizationContext context)
方法将响应代码设置为 401-Unauthorized
,但最终浏览器会收到 302-Found
响应。
如何发送 401 响应而不是 302 ?
更新:使用ASP.NET Core更新问题
答案 0 :(得分:15)
终于找到了解决方案。
使用 Cookie身份验证模块进行重定向。默认情况下,其LoginPath
属性设置为/Account/Login
。如果设置为PathString.Empty
,则会将状态代码保留为401-Unauthorized
,而不会将其更改为302-Found
。
更改 Startup.cs 中的CookieAuthenticationOptions
,如下所示:
public void ConfigureServices(IServiceCollection services)
{
// Other configurations ...
services.Configure<CookieAuthenticationOptions>(o =>
{
o.LoginPath = PathString.Empty;
});
// ...
}
LoginPath
属性的XML文档:
LoginPath属性通知中间件它应该更改传出的401 Unauthorized状态 将代码转换为302重定向到给定的登录路径。生成401的当前url被添加 作为由ReturnUrlParameter命名的查询字符串参数的LoginPath。一旦请求到了 LoginPath授予新的SignIn标识,ReturnUrlParameter值用于重定向浏览器 导致原始未授权状态代码的网址。
如果LoginPath为null或为空,则中间件不会查找401 Unauthorized状态代码,它会 登录发生时不会自动重定向。
更新:正如@swdon所指出的, ASP.NET Core 2.x 有不同的方法。
以下是link 1
中接受的答案从 ASP.NET Core 2.x :
开始services.ConfigureApplicationCookie(options =>
{
options.Events.OnRedirectToLogin = context =>
{
context.Response.StatusCode = 401;
return Task.CompletedTask;
};
});