在使用 ASP.Net WebAPI 时,我曾经有一个 custom Authorize
attribute我会使用返回一个 HTTP 403
或 401
视情况而定。例如如果用户未通过身份验证,则返回 401
;如果用户已通过身份验证但没有适当的权限,则返回 403
. See here for more discussion在那。
现在看来,在新的 ASP.Net Core 中,它们 don't want you overriding the Authorize
attribute不再支持基于策略的方法。然而,Core MVC 似乎遭受了与它的前辈相同的“只返回 401
对于所有身份验证错误”的方法。
如何覆盖框架以获得我想要的行为?
请您参考如下方法:
打开 issue here 后,看来这实际上应该工作......有点。
在您的 Startup.Configure
, 如果您只是调用 app.UseMvc()
并且不要注册任何其他中间件,你会得到401
对于任何与身份验证相关的错误(未通过身份验证,已通过身份验证但没有权限)。
但是,如果您注册了支持它的身份验证中间件之一,您将正确获得 401
对于未经身份验证和 403
没有权限。对我来说,我使用了 JwtBearerMiddleware
允许通过 JSON Web Token 进行身份验证.关键部分是设置AutomaticChallenge
创建中间件时的选项:
在 Startup.Configure
:
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true
});
app.UseMvc();
AutomaticAuthenticate
将设置
ClaimsPrincipal
自动访问
User
在 Controller 中。
AutomaticChallenge
允许 auth 中间件在 auth 错误发生时修改响应(在这种情况下设置
401
或
403
适当)。
如果您有自己的身份验证方案要实现,您将从
AuthenticationMiddleware
继承。和
AuthenticationHandler
类似于
JWT implementation works .