首页 > 解决方案 > 如何在 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;
}

标签: c#asp.net-corejwt

解决方案


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

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


推荐阅读