ASP.Net/ASP.NET Core Web API未授权请求返回302重定向响应而不是401

Saf*_*ain 8 asp.net asp.net-mvc asp.net-web-api asp.net-core asp.net-core-2.0

在ASP.Net/ASP.Net核心WebAPI中,

当客户端/浏览器尝试访问使用[Authorized]属性修饰的WebAPI端点时.它获取一个302-Found状态代码,其中包含对"登录"页面的重定向响应,而不是401-Unauthorized未经授权的请求.

注意:我注意到AuthorizeAttribute过滤器中的Fail(AuthorizationContext context)方法将响应代码设置为,但最终浏览器会获得响应.401-Unauthorized302-Found

如何发送401响应而不是302响应?

更新:使用ASP.NET Core更新问题

Saf*_*ain 16

终于找到了解决方案.

使用Cookie身份验证模块进行重定向.默认情况下,其LoginPath属性设置为/Account/Login.如果设置为PathString.Empty,则会将状态代码保留为401-Unauthorized不更改为302-Found.

更改CookieAuthenticationOptionsStartup.cs如下:

public void ConfigureServices(IServiceCollection services)
{
    // Other configurations ...

    services.Configure<CookieAuthenticationOptions>(o =>
    {
        o.LoginPath = PathString.Empty;
    });

    // ...
}
Run Code Online (Sandbox Code Playgroud)

LoginPath属性的XML文档:

LoginPath属性通知中间件它应该将传出的401 Unauthorized状态代码更改为302重定向到给定的登录路径.生成401的当前url作为ReturnUrlParameter命名的查询字符串参数添加到LoginPath.一旦对LoginPath的请求授予新的SignIn标识,ReturnUrlParameter值就会用于将浏览器重定向回导致原始未授权状态代码的URL.

如果LoginPath为null或为空,则中间件不会查找401 Unauthorized状态代码,并且在登录时不会自动重定向.


更新:正如@swdon所指出的,ASP.NET Core 2.x有不同的方法.

这是链接1中接受的答案:

ASP.NET Core 2.x开始:

services.ConfigureApplicationCookie(options =>
{
    options.Events.OnRedirectToLogin = context =>
    {
        context.Response.StatusCode = 401;    
        return Task.CompletedTask;
    };
});
Run Code Online (Sandbox Code Playgroud)

  • 您的解决方案无法在beta7中运行.它仍然返回302并重定向到登录.你有没有设法在beta 7中解决这个问题?现在还有AutomaticAuthentication属性,但是当我将其设置为false时,它会显示"未接受以下身份验证方案" (3认同)