首页 文章

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

提问于
浏览
6

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

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

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

如何发送 401 响应而不是 302

UPDATE: Update the question with ASP.NET Core

1 回答

  • 14

    终于找到了解决方案 .

    重定向发生在 Cookie Authentication 模块中 . 默认情况下,其 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值就会用于将浏览器重定向回导致原始未授权状态代码的URL . 如果LoginPath为null或为空,则中间件不会查找401 Unauthorized状态代码,并且在登录时不会自动重定向 .


    UPDATE: 正如@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;
        };
    });
    

相关问题