Asp.net 如何创建和使用JWT基于角色的身份验证?

Asp.net 如何创建和使用JWT基于角色的身份验证?,asp.net,asp.net-core,asp.net-core-3.1,asp.net-roles,asp.net-authentication,Asp.net,Asp.net Core,Asp.net Core 3.1,Asp.net Roles,Asp.net Authentication,我遵循下面的教程链接 我试图了解它是如何工作的,我想使用这个令牌使用基于角色的身份验证。因此,我在Startup.cs文件中制定了另一个策略,如下所示 我尝试在控制器中像[Authorize(Policy=“admin”)]或[Authorize(Policy=“ApiUser”)]一样使用它,但每次尝试时,我都会使用邮递员获得未经验证的。 我错过了什么?如何根据教程进行基于角色的身份验证 启动 services.AddAuthorization(options => { opt

我遵循下面的教程链接

我试图了解它是如何工作的,我想使用这个令牌使用基于角色的身份验证。因此,我在
Startup.cs
文件中制定了另一个策略,如下所示

我尝试在控制器中像
[Authorize(Policy=“admin”)]
[Authorize(Policy=“ApiUser”)]
一样使用它,但每次尝试时,我都会使用
邮递员
获得未经验证的
。
我错过了什么?如何根据教程进行基于角色的身份验证

启动

services.AddAuthorization(options =>
{
    options.AddPolicy("ApiUser", policy => policy.RequireClaim(Constants.Strings.JwtClaimIdentifiers.Rol, Constants.Strings.JwtClaims.ApiAccess));
});
services.AddAuthorization(options =>
    options.AddPolicy("admin", policy => policy.RequireRole("admin"))
);


验证控制器

// POST api/auth/login
[HttpPost("login")]
public async Task<IActionResult> Post([FromBody]CredentialsViewModel credentials)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    var identity = await GetClaimsIdentity(credentials.UserName, credentials.Password);



    if (identity == null)
    {
        //return null;
        return BadRequest(Error.AddErrorToModelState("login_failure", "Invalid username or password.", ModelState));
    }
    var id = identity.Claims.Single(c => c.Type == "id").Value; 
    var user = await _userManager.FindByIdAsync(id);
    IList<string> role = await _userManager.GetRolesAsync(user);
    var jwt = await Tokens.GenerateJwt(identity, role[0], _jwtFactory, credentials.UserName, _jwtOptions, new JsonSerializerSettings { Formatting = Formatting.Indented });


    return new OkObjectResult(jwt);

}
我用教程做了我的

它也适用于.NETCore3.1

@更新

我正在为此使用策略:

services.AddAuthorization(选项=>{
options.AddPolicy(Policies.RequireAny,policy=>
policy.requirecarel(JwtClaimTypes.Role、Enum.GetNames(typeof(AvailableRoles));
options.AddPolicy(Policies.requiredmin,policy=>
policy.requirecall(JwtClaimTypes.Role,
AvailableRoles.Admin.ToString());
});
和在控制器中

[HttpDelete({id:int:min(1)})]
[授权(策略=策略.RequireAdmin)]
公共异步任务删除(int-id){
//代码
返回Ok();
}
在创建JWT令牌时:


//其他索赔和代码。。。
claims.Add(新索赔(JwtClaimTypes.Role,roles[0]))
var token=新的JwtSecurityToken(
颁发者:_appSettings.AppUrl,
受众:_appSettings.AppUrl,
索赔:索赔,
过期:过期,
签名凭据:凭据
);
返回新的JwtSecurityTokenHandler().WriteToken(令牌);

首先,确保在
appsettings.json中添加了json字符串,否则您总是会得到
401个未经授权的

"JwtIssuerOptions": {
    "Issuer": "webApi",
    "Audience": "http://localhost:5000/"
}
我错过了什么?如何根据教程进行基于角色的身份验证

1.如果要使用以下方式注册服务:

services.AddAuthorization(options =>
    options.AddPolicy("admin", policy => policy.RequireRole("admin"))
);
authorize属性应如下所示:

[Authorize(Policy  = "admin")]
public async Task<string> GenerateEncodedToken(string userName, ClaimsIdentity identity)
{
    var claims = new[]
    {
            new Claim(JwtRegisteredClaimNames.Sub, userName),
            new Claim(JwtRegisteredClaimNames.Jti, await _jwtOptions.JtiGenerator()),
            new Claim(JwtRegisteredClaimNames.Iat, ToUnixEpochDate(_jwtOptions.IssuedAt).ToString(), ClaimValueTypes.Integer64),
            identity.FindFirst(Helpers.Constants.Strings.JwtClaimIdentifiers.Rol),
            identity.FindFirst(Helpers.Constants.Strings.JwtClaimIdentifiers.Id),
            new Claim(ClaimTypes.Role,"admin")
    };
        //...
}
2.如果要使用以下方式:

[Authorize(Roles = "admin")]
您需要从Startup.cs中删除服务:

//services.AddAuthorization(options =>
//    options.AddPolicy("admin", policy => policy.RequireRole("admin"))
//);
然后,不要忘记在
JwtFactory中添加具有角色的索赔。GenerateEncodedToken
如下所示:

[Authorize(Policy  = "admin")]
public async Task<string> GenerateEncodedToken(string userName, ClaimsIdentity identity)
{
    var claims = new[]
    {
            new Claim(JwtRegisteredClaimNames.Sub, userName),
            new Claim(JwtRegisteredClaimNames.Jti, await _jwtOptions.JtiGenerator()),
            new Claim(JwtRegisteredClaimNames.Iat, ToUnixEpochDate(_jwtOptions.IssuedAt).ToString(), ClaimValueTypes.Integer64),
            identity.FindFirst(Helpers.Constants.Strings.JwtClaimIdentifiers.Rol),
            identity.FindFirst(Helpers.Constants.Strings.JwtClaimIdentifiers.Id),
            new Claim(ClaimTypes.Role,"admin")
    };
        //...
}
public异步任务GenerateEncodedToken(字符串用户名、索赔实体标识)
{
风险值索赔=新[]
{
新索赔(JwtRegisteredClaimNames.Sub,用户名),
新索赔(JwtRegisteredClaimNames.Jti,wait_jwtOptions.JtiGenerator()),
新索赔(JwtRegisteredClaimNames.Iat,ToUnixEpochDate(_jwtOptions.IssuedAt).ToString(),ClaimValueTypes.Integer64),
identity.FindFirst(Helpers.Constants.Strings.jwtclaiminntifiers.Rol),
identity.FindFirst(Helpers.Constants.Strings.jwtclaiminntifiers.Id),
新索赔(索赔类型。角色,“管理员”)
};
//...
}

假设您可以使用令牌获取数据,那么如何使用角色?限制通行权?你能分享一下你是怎么做到的吗?我完全明白,它在未经授权的情况下不起作用。更多的澄清是我的整个项目。这里的“aaa”是什么?哦,天哪!!!appsetting.json!!这就是问题所在!当我这样做时//services.AddAuthorization(options=>//options.AddPolicy(“admin”),policy=>policy.RequireRole(“admin”)//);如何设置角色并使用它?你的github有例子吗?无论如何,非常感谢你,这是“管理员”,我修改了它。如果我的回答对你有帮助,你能问我最后一件事吗?如何区分管理员和用户?它是怎么做的?当登录时,它现在自动成为apiuser,那么我如何制定其他策略并使用它?你有例子或文章吗?