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

时间:2015-05-23 09:54:42

标签: 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-Unauthorized ,但最终浏览器会收到 302-Found 响应。

如何发送 401 响应而不是 302

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

1 个答案:

答案 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;
    };
});