在使用 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 .


