【发布时间】: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