覆盖 ASP.NET Core 中 JWT 中使用的声明键名称

问题描述 投票:0回答:3

不向系统客户端泄露实现细节被认为是最佳实践。例如,不要使用“Powered by foo”标题等进行响应

System.Security.Claims.ClaimTypes
包含各种以 Microsoft 为中心的架构,这是人们正在使用 ASP.NET Core 的提示。

例如,

Role
主张是:
"http://schemas.microsoft.com/ws/2008/06/identity/claims/role"

所以:

  • 是否有其他方法对 JWT 进行编码以避免此问题? (无需对整个身份验证层进行自定义编码)。
  • 特别是对于角色声明,它的密钥可以以某种方式重命名吗?运行时提供有用的自动检测和在 Identity 中使用。我想继续使用此功能,只是以某种方式重命名声明的密钥。
.net asp.net-core jwt bearer-token asp.net-core-2.2
3个回答
1
投票

我认为这有点牵强,因为这些类型来自旧的 WIF。所以他们没有指向asp.net core。

您可以使用其他名称。在权限中添加声明(而不是角色)以设置声明类型。其中角色的声明类型可以是“角色”。

为了映射声明,请配置资源:

services
    .AddAuthentication()
    .AddJwtBearer(c =>
    {
        c.TokenValidationParameters.RoleClaimType = "role";
        c.TokenValidationParameters.NameClaimType = "name";
    })

但“问题”仍然是 JWT 是公共令牌。真正隐藏此类信息的唯一方法是不将其放入代币中并选择不同的设计。


1
投票

我也遇到了同样的问题,这是我的解决方案

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”也添加为“角色”。这对我有用。


0
投票

您可以简单地自己创建您的声明:

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中。他们将在您的令牌中定义这些密钥。

我遇到了“电子邮件”问题,没有被传递到受保护的路由,但这是另一个问题..我可能已经找到了解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.