如果通过JwtBearerAuthentication中间件设置的ClaimsIdentity没有足够的角色通过
f <- function(x) c(NA,(tail(x,-1) - head(x,-1))/head(x,-1))
它返回401而不是403。
我在整个晚上都在asp.net核心网络API中苦苦挣扎。我也在stackoverflow上看到了这个问题,但我还没有看到任何可以解决的问题。注册中间件和AutomaticChallange设置的顺序完成了这项工作。
我不知道我是否遗漏了一些东西,但似乎令人震惊的是,这已经多年没有得到妥善解决。太烦人了。
有没有正常的,通常的,非解决方法,非黑客的解决方法?
更新(回应@juunas的评论)
我已经尝试过,并且可以从Claims中正确映射角色。 因此,如果我从属性中删除角色需求,则为用户分配的所有角色(在JWT令牌中)User.IsInRole(x)返回true。因此,映射工作正常。
关于从基于角色的授权转移到策略......您能否提供一些与最佳实践,建议或基于该声明的内容的链接? 我并不是说它不是要做的事情,而是想了解它。
答案 0 :(得分:0)
了解这些与错误的区别,了解为什么会得到一个而不是另一个错误,这一点非常重要。
401用于身份验证。如果您收到此错误,那么您必须问自己是用户是否已登录,或者用户是否拥有有效令牌提供程序提供的当前令牌?如果令牌已过期或者提供者无效,那么你可以获得401.如果这是你得到的,那么你需要检查User.Identity.IsAuthenticated这是否返回true?很可能它会返回false。
403用于授权。这意味着用户具有有效令牌,但他们拥有的令牌不会授予他们访问他们请求的资源的权限。这是你想要检查User.IsInRole()的地方,它会返回false。
如果您获得401,则意味着该用户尚未经过身份验证,即他们尚未登录,他们的登录无效,令牌已过期......等等。关注用户还没有证明他们是他们所说的人。
编辑:抱怨假设用户没有经过身份验证,我没有看到你在第一篇帖子中说明他们在哪里。在没有看到代码的情况下很难提供帮助,但我的下一个猜测是声明检查尚未添加到服务管道中。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddAuthorization(options =>
{
options.AddPolicy("whateverrole", policy => policy.RequireClaim("whateverrole"));
});
}
这是在你的Startup.cs中。 MS doc在这里https://docs.microsoft.com/en-us/aspnet/core/security/authorization/claims
上次更新:只需使用默认的授权属性标记,您就无法更改它。由于管道中可能影响身份验证的层数,MS以这种方式进行设计。我没有意识到这一点,因为我使用自定义的Authorize属性,忘记了我写了处理状态代码的方式。
但是我找到了一个可以满足您需求的好解决方案https://github.com/aspnet/Security/issues/872#issuecomment-232624106
它在app.UseMvc()之前向管道添加了一个错误页面,它将身份验证错误重定向到返回正确状态代码的错误页面。