Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET核心JWT身份验证和授权角色声明_C#_Asp.net Core_Jwt - Fatal编程技术网

C# ASP.NET核心JWT身份验证和授权角色声明

C# ASP.NET核心JWT身份验证和授权角色声明,c#,asp.net-core,jwt,C#,Asp.net Core,Jwt,我已经成功地在我的API上实现了JWT令牌身份验证,但是,我正在努力将角色声明集成到身份验证过程中 我想要实现的是,能够将以下内容添加到控制器中的调用中,并让站点自动针对经过身份验证的用户检查角色声明: [Authorize(Roles = "SiteAdmin")] 这是生成JWT令牌的代码: private string GenerateJwtToken(UserDto user) { // generate token that is

我已经成功地在我的API上实现了JWT令牌身份验证,但是,我正在努力将角色声明集成到身份验证过程中

我想要实现的是,能够将以下内容添加到控制器中的调用中,并让站点自动针对经过身份验证的用户检查角色声明:

[Authorize(Roles = "SiteAdmin")]
这是生成JWT令牌的代码:

    private string GenerateJwtToken(UserDto user)
    {
        // generate token that is valid for 7 days
        var tokenHandler = new JwtSecurityTokenHandler();
        var key = Encoding.ASCII.GetBytes(_appSettings.Secret);
        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(new[] { new Claim("userAccountId", user.UserAccountId.ToString()) }),
            Expires = DateTime.UtcNow.AddHours(_appSettings.JwtExpiryHours),
            SigningCredentials =
                new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
        };

        var token = tokenHandler.CreateToken(tokenDescriptor);
        return tokenHandler.WriteToken(token);
    }
我已尝试在此处遵循此指南()并将上述函数更改为:

    private async Task<string> GenerateJwtToken(UserDto user)
    {
        // generate token that is valid for 7 days
        var tokenHandler = new JwtSecurityTokenHandler();
        var key = Encoding.ASCII.GetBytes(_appSettings.Secret);
        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(new[] { new Claim("userAccountId", user.UserAccountId.ToString()) }),
            Expires = DateTime.UtcNow.AddHours(_appSettings.JwtExpiryHours),
            SigningCredentials =
                new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature),
            Claims = await FetchClaims(user.UserAccountId)
        };

        var token = tokenHandler.CreateToken(tokenDescriptor);
        return tokenHandler.WriteToken(token);
    }

    private async Task<Dictionary<string, object>> FetchClaims(int userId)
    {
        var userPermissions = await GetUserPermissionsByUserId(userId);
        var userClaims = new Dictionary<string, object>();

        foreach (var userPermission in userPermissions)
        {
            userClaims.Add("http://schemas.microsoft.com/ws/2008/06/identity/claims/role", userPermission.PermissionName);
        }

        return userClaims;
    }
private async Task GenerateJwtToken(UserDto用户)
{
//生成有效期为7天的令牌
var tokenHandler=new JwtSecurityTokenHandler();
var key=Encoding.ASCII.GetBytes(_appSettings.Secret);
var tokenDescriptor=新的SecurityTokenDescriptor
{
Subject=newclaimsidentity(new[]{newclaim(“userAccountId”,user.userAccountId.ToString())}),
Expires=DateTime.UtcNow.AddHours(_appSettings.jwtexpireyHours),
签署证书=
新的签名凭证(新的SymmetricSecurityKey、SecurityAlgorithms.HMACSHA256签名),
声明=等待获取声明(user.UserAccountId)
};
var token=tokenHandler.CreateToken(tokenDescriptor);
返回tokenHandler.WriteToken(令牌);
}
私有异步任务FetchClaims(int userId)
{
var userPermissions=await GetUserPermissionsByUserId(userId);
var userClaims=newdictionary();
foreach(userPermissions中的var userPermission)
{
userClaims.Add(“http://schemas.microsoft.com/ws/2008/06/identity/claims/role,userPermission.PermissionName);
}
归还索赔;
}
虽然上述内容在理论上在我的头脑中是有意义的,但我不能添加多个角色声明,因为在向字典中添加userClaim时,它会添加一个重复的键


我一定是误解了这个实现是如何工作的,如果有任何帮助,我将不胜感激。

我也不确定“权限”是怎么回事,但假设你得到了角色

您只需以这种方式重构它,然后将声明列表添加到传递给
ClaimsIdentity
的集合中:

private async Task GenerateJwtToken(UserDto用户)
{
//生成有效期为7天的令牌
var tokenHandler=new JwtSecurityTokenHandler();
var key=Encoding.ASCII.GetBytes(_appSettings.Secret);
var声明=新列表(等待获取声明(user.UserAccountId)){
新声明(“userAccountId”,user.userAccountId.ToString())
};
var tokenDescriptor=新的SecurityTokenDescriptor
{
主题=新的索赔实体(索赔),
Expires=DateTime.UtcNow.AddHours(_appSettings.jwtexpireyHours),
签署证书=
新的签名凭证(新的SymmetricSecurityKey,SecurityAlgorithms.HmacSha256Signature)
};
var token=tokenHandler.CreateToken(tokenDescriptor);
返回tokenHandler.WriteToken(令牌);
}
私有异步任务FetchClaims(int userId)
{
var userPermissions=await GetUserPermissionsByUserId(userId);
返回用户权限
.Select(x=>newclaim(ClaimTypes.Role,x.PermissionName));
}
(如果需要,也可以使用
JwtSecurityToken
而不是
SecurityTokenDescriptor
;它直接接受
IEnumerable
。)


我承认我已经有一段时间没有使用角色了,所以如果它不起作用,请告诉我。但通过快速的谷歌搜索,在代币上添加多个角色声明似乎是合法的。[编辑:我测试了添加多个角色声明并对其进行授权,这对我很有效。]

您添加了角色声明,但这些值看起来像权限?那太令人困惑了。您可以尝试通过逗号分隔的角色名称添加多个角色(当然,用户声明的角色只有一个键)。这非常有效,感谢您花时间完成所有这些!非常感谢。