简体   繁体   English

从 JWT 令牌中获取声明、权限和角色

[英]Get Claims, Permissions and Roles from JWT Token

I am implementing a /refresh-token endpoint in my .NET 6 application.我在我的 .NET 6 应用程序中实现了一个 /refresh-token 端点。 The Controller takes the JWT Token from the headers, decode it and issue new token. Controller 从标头中获取 JWT 令牌,对其进行解码并发布新令牌。

The type of Itemvalue for role and permissions is Newtonsoft.Json.Linq.JArray.角色和权限的 Itemvalue 类型是 Newtonsoft.Json.Linq.JArray。

Am I doing it properly or there is a better solution?我做得对还是有更好的解决方案?

        var handler = new JwtSecurityTokenHandler();
        var oldTokenDecoded = handler.ReadJwtToken(oldToken);


        List<string> rolesDecoded = new List<string>();
        List<string> permissionsDecoded = new List<string>();
        string UsernameDecoded = "";
        string UserIDDecoded = "";

        foreach(var item in oldTokenDecoded.Payload)
        {
            if(item.Key == "role")
            {
                rolesDecoded = JsonConvert.DeserializeObject<List<string>>(item.Value.ToString());
            }

            if(item.Key == "permissions")
            {
                permissionsDecoded = JsonConvert.DeserializeObject<List<string>>(item.Value.ToString());
            }

            if(item.Key == "Username")
            {
                UsernameDecoded = item.Value.ToString();
            }

            if(item.Key == "UserID")
            {
                UserIDDecoded = item.Value.ToString();
            }
            
        }
        
        var jwtToken = JWTBearer.CreateToken(
                signingKey: "token",
                expireAt: DateTime.UtcNow.AddDays(1),
                claims: new[] { ("Username", UsernameDecoded), ("UserID", UserIDDecoded) },
                roles: rolesDecoded,
                permissions: permissionsDecoded);```

Use .Claims to iterate through claims instead of your current approach:使用.Claims遍历声明而不是您当前的方法:

List<string> roles = new List<string>();
List<string> permissions = new List<string>();
string username;
string userId;
foreach(var item in oldTokenDecoded.Claims)
{
    switch (item.Type)
    {
        case "role":
            roles.Add(item.Value);
            break;
        case "permission":
            permissions.Add(item.Value);
            break;
        case "Username":
            username = item.Value;
            break;
        case "UserID":
            userId = item.Value;
            break;
        // etc
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM