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;
}
解决方案
foreach (var item in roles)
{
list.Add(new Claim(ClaimTypes.Role, item.Role.RoleTitle));
}
在上面的代码中,您添加了许多具有相同类型 (ClaimTypes.Role) 的声明,并且 json 序列化程序无法对其进行序列化。
推荐阅读
- asp.net - ASP.net gridview 无法更新图片
- cocos2d-x - Cocos2d 让物理体可以通过任何东西
- dart - Flutter - 切换选项卡时保存交互或状态
- android - 将 4 张图像从活动传递到其他活动
- python - python 一个脚本中的多个函数
- java - 如何从 Swagger ApiModelProperty 注释生成示例 POJO?
- audio - 将 AL_GAIN 设置为 0 适用于 iPhone6,而不适用于 iPad PRO?
- django - 从 django 中的不同类获取值
- node.js - CryptoCurrency - Byteball 中全节点之间的通信
- c# - Xamarin 形成 SQLite 关系