授权角色/策略属性在 .Net Core 3 中不起作用

lev*_*jay 6 .net-core asp.net-core identityserver4 asp.net-core-identity .net-core-3.0

我没有运气在 .Net Core 3 中获得任何角色或策略属性。我使用带有身份验证的 .Net Core Angular 启动项目开始了我的项目。我认为这与新的 .AddDefault 方法有关,所以我尽可能地简化了它,但它仍然不起作用。

这是我的政策:

services.AddAuthorization(options =>
{
    options.AddPolicy("IsAdmin", policy =>
        policy.RequireClaim("role", "admin"));
});
Run Code Online (Sandbox Code Playgroud)

这是我的控制器:

[Authorize(Policy = "IsAdmin")]
[Route("api/[controller]")]
public class AdminController : Controller 
{
    ...
Run Code Online (Sandbox Code Playgroud)

我制作了一个自定义 Profile 服务,将声明添加到令牌中,

var claims = new List<Claim>();

if (await _userManager.IsInRoleAsync(user, "Admin"))
{
    claims.Add(new Claim(JwtClaimTypes.Role, "admin"));
}

context.IssuedClaims.AddRange(claims);
Run Code Online (Sandbox Code Playgroud)

在我的访问令牌中(来自 jwt.io):

在此处输入图片说明

配置服务的其他部分:

services.AddDefaultIdentity<ApplicationUser>()
    .AddRoles<IdentityRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>();

...

services.AddAuthentication()
    .AddIdentityServerJwt();
Run Code Online (Sandbox Code Playgroud)

普通[Authorize]标签与其他控制器上的访问令牌一起工作正常。

当我用访问令牌点击这个控制器时,我得到了一个403响应

我错过了什么阻止它工作?

itm*_*nus 14

我尝试了您的代码,发现role声明键已转换为标准 Role ClaimsTypehttp://schemas.microsoft.com/ws/2008/06/identity/claims/role

在此处输入图片说明

所以使用ClaimTypes.Role将解决问题:

services.AddAuthorization(options => { 
    options.AddPolicy("IsAdmin", policy => 
    { 
        policy.RequireClaim( ClaimTypes.Role ,"admin");
    }); 
});

演示

在此处输入图片说明