C# 如何在asp.net core中创建jwt令牌
我得到这个错误: System.Text.Json.JsonException:检测到不支持的可能的对象循环。这可能是由于循环造成的,或者如果对象深度大于允许的最大深度32 我的代码: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
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));
}