如何在asp.net核心中创建jwt令牌

时间:2020-01-08 19:02:34

标签: c# asp.net-core jwt

我收到此错误:

System.Text.Json.JsonException:检测到不支持的可能的对象循环。这可能是由于循环造成的,或者是物体深度大于允许的最大深度32。

我的代码:

public string GeneratJwt(Users users, List<UserRoles> roles)
{
            var secretKey = Encoding.UTF8.GetBytes("NewSecurity123456");
            var signingCredentials = new SigningCredentials(new SymmetricSecurityKey(secretKey), SecurityAlgorithms.HmacSha256Signature);

            var claims = _getClaims(users, roles);

            var descriptor = new SecurityTokenDescriptor
            {
                Issuer = "MyApi",
                Audience = "OnlineStorePerfume",
                IssuedAt = DateTime.Now,
                NotBefore = DateTime.Now,
                Expires = DateTime.Now.AddDays(3),
                SigningCredentials = signingCredentials,
                Subject = new ClaimsIdentity(claims)
            };

            var tokenHandler = new JwtSecurityTokenHandler();
            var secretToken = tokenHandler.CreateToken(descriptor);

            var jwt = tokenHandler.WriteToken(secretToken);
            return jwt;
}

private IEnumerable<Claim> _getClaims(Users users, List<UserRoles> roles)
{
            var list = new List<Claim>
            {
                new Claim(ClaimTypes.Name, users.UserName),
                new Claim(ClaimTypes.NameIdentifier, users.UserId.ToString()),
            };

            foreach (var item in roles)
            {
                list.Add(new Claim(ClaimTypes.Role, item.Role.RoleTitle));
            }

            return list;
}

1 个答案:

答案 0 :(得分:0)

foreach (var item in roles)
{
     list.Add(new Claim(ClaimTypes.Role, item.Role.RoleTitle));
}

在上面的代码中,您正在添加许多具有相同类型(ClaimTypes.Role)的声明,并且json序列化程序无法对其进行序列化。