【问题标题】:ASP.Net / ASP.NET Core Web API unauthorized requests returns 302 redirect response instead of 401ASP.Net / ASP.NET Core Web API 未经授权的请求返回 302 重定向响应而不是 401
【发布时间】:2015-08-05 08:06:57
【问题描述】:

在 ASP.Net/ASP.Net Core WebAPI 中,

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

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

如何发送 401 响应而不是 302

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

【问题讨论】:

  • 我想你可能会在stackoverflow.com/questions/20149750/… 中找到答案,因为这对 vNext 来说并不新鲜。
  • @FrankWitte 感谢您的回答,但没有奏效。在 ASP.NET 5 中,AFAIK System.WebSystem.Web.Http.AuthorizeAttributeSystem.Web.Mvc.AuthorizeAttribute)不再使用,而是 Microsoft.AspNet.Mvc 具有 AuthorizeAttribute。正如我所提到的,它在 Fail 方法中正确设置了 401 代码。我发现 Identity 中间件 (app.UseIdentity()) 将 401 代码转换为 302。作为一个肮脏的解决方案,我可以将中间件放在 Identity 中间件之上并转换回 401。但是,仍然希望以获得更好的解决方案。无论如何再次感谢。 :)
  • How to return 401 instead of 302 in ASP.NET Core?Disable Not Authorized Redirect to Account/Login in ASP.NET Core 可能有用。接受的答案不适用于 Asp.Net Core 2.2。链接 1 中的答案有效。

标签: asp.net asp.net-mvc asp.net-web-api asp.net-core asp.net-core-2.0


【解决方案1】:

终于找到解决办法了。

重定向发生在 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 授予新的 SignIn 身份,ReturnUrlParameter 值用于将浏览器重定向回来 到导致原始未授权状态码的url。

如果 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;
    };
});

【讨论】:

  • 您的解决方案在 beta7 中不起作用。它仍然返回 302 并重定向到登录。您是否设法在 beta 7 中解决了这个问题?现在还可以使用 AutomaticAuthentication 属性,但是当我将其设置为 false 时,它​​会显示“不接受以下身份验证方案”
  • @Vitaly,设置 AutomaticChallenge = false 并使用 AuthorizeAttribute 和 Schema 参数,如下所示:[Authorize(ActiveAuthenticationSchemes = "ApplicationCookie")]。您还应该在启动时指定您的架构。参加 RC1-Final
  • 但这会破坏 mvc redirectino 以登录否?
猜你喜欢
  • 2023-03-07
  • 2013-02-26
  • 2015-09-21
  • 2020-10-30
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多