【问题标题】:Asp.Net Core MVC middleware returns 404 instead of 401 even with AuthorizeFilter即使使用 AuthorizeFilter,Asp.Net Core MVC 中间件也会返回 404 而不是 401
【发布时间】:2020-02-24 18:12:21
【问题描述】:

我有一个非常简单的 web api 应用程序,配置如下:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseAuthentication();
    app.UseMvc();
}

Services 有这样的 MVC 注册:

_services
    .AddMvc(config =>
    {
        var policy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .Build();
        config.Filters.Add(new AuthorizeFilter(policy));
    })

没有为 root 注册默认路由,所以当我向应用程序的 root 发出请求时,我得到 404。我期望得到的是 401,尽管我认为绝对所有请求都应该需要授权。

我还没有找到实现这一点的方法,甚至不确定这在语义上是否正确,但我的 API 中没有开放端点,如果任何路由都没有身份验证,我只想返回 401。

【问题讨论】:

  • 您正在添加一个 MVC 过滤器以在 MVC 处理管道期间运行,但是当没有匹配的操作时没有运行管道。所以UseMvc 将请求传递给下一个中间件,但当然没有,这就是你得到 404 的原因。
  • 一种解决方案是在 UseMvc 之后的终端中间件,它只返回 401。
  • 感谢您的解释,实际上我已经怀疑了很多,但不确定修复它的最佳方法是什么。
  • 不客气。我不知道这是修复它的最好的方法,但它可能是最简单的。 :)
  • 我认为在这种情况下返回 401 并不常见,但这并不意味着它是错误的。我想这取决于你的 API 的消费者。例如,如果您说 401,他们是否会对您为什么不接受他们的凭据感到困惑? 404 更明确,没有真正放弃任何东西。事实上,有时我会看到 403 变成 404 以隐藏未经授权的用户(例如私人 GitHub 存储库)。

标签: authentication asp.net-core


【解决方案1】:

ASP.NET 内部使用 401,你总是会得到 404,你可以使用

AddAuthentification() 服务收集器中的扩展

   services.AddAuthentication(options =>
        {
            options.DefaultScheme = "Cookies";
        }).AddCookie("Cookies",
          (options) =>
          {
              options.AccessDeniedPath = "..your access denied page route..";
              options.LoginPath ="..your login route.."
          })

【讨论】:

  • 对不起,我没有提到,我已经使用了带有身份验证的服务
  • 您可以使用中间件来处理应用程序构建器中的错误,例如 app.UseStatusCodePagesWithRedirects("~/Error/{0}"); 和错误是您的控制器名称。并且 {0} 将被状态码替换,您的操作将是这样的[HttpGet] [Route("{id}")] public IActionResult Get(int id) { Response.StatusCode = id; return View(); }
猜你喜欢
  • 2021-04-21
  • 1970-01-01
  • 2019-01-04
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
  • 2020-11-30
相关资源
最近更新 更多