不向系统客户端泄露实现细节被认为是最佳实践。例如,不要使用“Powered by foo”标题等进行响应
System.Security.Claims.ClaimTypes
包含各种以 Microsoft 为中心的架构,这是人们正在使用 ASP.NET Core 的提示。
例如,
Role
主张是:"http://schemas.microsoft.com/ws/2008/06/identity/claims/role"
。
所以:
我认为这有点牵强,因为这些类型来自旧的 WIF。所以他们没有指向asp.net core。
您可以使用其他名称。在权限中添加声明(而不是角色)以设置声明类型。其中角色的声明类型可以是“角色”。
为了映射声明,请配置资源:
services
.AddAuthentication()
.AddJwtBearer(c =>
{
c.TokenValidationParameters.RoleClaimType = "role";
c.TokenValidationParameters.NameClaimType = "name";
})
但“问题”仍然是 JWT 是公共令牌。真正隐藏此类信息的唯一方法是不将其放入代币中并选择不同的设计。
我也遇到了同样的问题,这是我的解决方案
var roles = await _userManager.GetRolesAsync(user);
foreach (var role in roles)
{
claims.Add(new Claim(ClaimTypes.Role, role));
claims.Add(new Claim("roles", role));
}
“ClaimTypes.Role”也添加为“角色”。这对我有用。
您可以简单地自己创建您的声明:
List<Claim> claims = new()
{
new Claim("name", userModel.UserName),
new Claim(ClaimTypes.Email, userModel.Email),
new Claim("email", userModel.Email),
new Claim("id", userModel.Id),
};
然后将它们添加到您的Token中。他们将在您的令牌中定义这些密钥。
我遇到了“电子邮件”问题,没有被传递到受保护的路由,但这是另一个问题..我可能已经找到了解决方案。