C# 如何在asp.net core中创建jwt令牌

C# 如何在asp.net core中创建jwt令牌,c#,asp.net-core,jwt,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

我得到这个错误:

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;
}
公共字符串生成器JWT(用户、列表角色)
{
var secretKey=Encoding.UTF8.GetBytes(“NewSecurity123456”);
var signingCredentials=新的signingCredentials(新的SymmetricSecurityKey(secretKey)、SecurityAlgorithms.HmacSha256Signature);
var索赔=_getClaims(用户、角色);
var descriptor=新的SecurityTokenDescriptor
{
发卡机构=“MyApi”,
观众=“在线商店香水”,
IssuedAt=日期时间。现在,
NotBefore=DateTime。现在,
Expires=DateTime.Now.AddDays(3),
SigningCredentials=SigningCredentials,
主题=新的索赔实体(索赔)
};
var tokenHandler=new JwtSecurityTokenHandler();
var secretToken=tokenHandler.CreateToken(描述符);
var jwt=tokenHandler.WriteToken(secretToken);
返回jwt;
}
私有IEnumerable\u getClaims(用户、列表角色)
{
变量列表=新列表
{
新索赔(ClaimTypes.Name、users.UserName),
新声明(ClaimTypes.NameIdentifier,users.UserId.ToString()),
};
foreach(角色中的变量项)
{
添加(新索赔(ClaimTypes.Role,item.Role.RoleTitle));
}
退货清单;
}

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

我认为这不是由创建令牌函数引起的,您能检查一下json循环引用的原因吗?
foreach (var item in roles)
{
     list.Add(new Claim(ClaimTypes.Role, item.Role.RoleTitle));
}