在ASP.Net / ASP.Net Core WebAPI中
当客户机/浏览器试图访问使用[Authorized]
属性修饰的WebAPI端点时。它获取带有重定向响应的302-Found
状态代码,而不是针对未经授权的请求的401-Unauthorized
。
注意:我注意到Fail(AuthorizationContext context)
方法在AuthorizeAttribute过滤器中将响应代码设置为401-Unauthorized
,,但最终浏览器会得到302-Found
响应。
如何发送401响应而不是302?
更新:用ASP.NET Core更新问题
发布于 2015-05-23 17:46:38
终于找到了解决办法。
重定向发生在Cookie身份验证模块中。默认情况下,其LoginPath
属性设置为/Account/Login
。如果它被设置为PathString.Empty
,它将保持状态代码为401-Unauthorized
,而不将其更改为302-Found
。
更改CookieAuthenticationOptions
in Startup.cs如下:
public void ConfigureServices(IServiceCollection services)
{
// Other configurations ...
services.Configure<CookieAuthenticationOptions>(o =>
{
o.LoginPath = PathString.Empty;
});
// ...
}
LoginPath
属性的XML文档:
LoginPath属性通知中间件,它应该将传出的401未经授权的状态代码更改为302重定向到给定的登录路径。生成401的当前url作为由LoginPath命名的查询字符串参数添加到ReturnUrlParameter中。一旦对LoginPath的请求授予了一个新的SignIn标识,就会使用ReturnUrlParameter值将浏览器重定向回url,这会导致原始的未经授权的状态代码。 如果LoginPath为空或空,中间件将不会查找401个未经授权的状态代码,并且在登录时不会自动重定向。
更新:正如@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;
};
});
https://stackoverflow.com/questions/30411296
复制相似问题