在ASP.Net / ASP.Net核心的WebAPI,
当客户端/浏览器尝试访问装饰有[Authorized]
属性的WebAPI端点。它得到了响应重定向到登录页面302-Found
状态代码,而不是401-Unauthorized
未经授权的请求。
注:我已经注意到AuthorizeAttribute滤波器Fail(AuthorizationContext context)
方法设置响应代码401-Unauthorized
,但最终浏览器获得一个302-Found
响应。
我怎么能发送401响应,而不是302?
更新:更新与ASP.NET核心问题
终于找到了解决办法。
重定向发生与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被添加到LOGINPATH由ReturnUrlParameter命名查询字符串参数。一旦到LOGINPATH请求授予新的登入身份,ReturnUrlParameter值用于浏览器重定向到这引起了原非授权状态代码的URL。
如果LOGINPATH为null或空,中间件也不会去找401个Unauthorized状态码,并且在登录时它不会自动重定向。
更新:由于@swdon指出,ASP.NET核心2.x中有这样做的不同的方式。
下面是来自link 1接受的答案:
由于ASP.NET核心2.X的:
services.ConfigureApplicationCookie(options =>
{
options.Events.OnRedirectToLogin = context =>
{
context.Response.StatusCode = 401;
return Task.CompletedTask;
};
});