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

问题描述 投票:7回答:1

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

当客户端/浏览器尝试访问装饰有[Authorized]属性的WebAPI端点。它得到了响应重定向到登录页面302-Found状态代码,而不是401-Unauthorized未经授权的请求。

注:我已经注意到AuthorizeAttribute滤波器Fail(AuthorizationContext context)方法设置响应代码401-Unauthorized,但最终浏览器获得一个302-Found响应。

我怎么能发送401响应,而不是302?

更新:更新与ASP.NET核心问题

asp.net asp.net-mvc asp.net-web-api asp.net-core asp.net-core-2.0
1个回答
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被添加到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;
    };
});
© www.soinside.com 2019 - 2024. All rights reserved.