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

时间:2019-05-13 16:47:42

标签: .net asp.net-core jwt bearer-token asp.net-core-2.2

不将实施细节泄漏给系统的客户被认为是最佳实践。例如,不要用“ Powered by foo”标题响应,等等。

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

例如Role的声明是:"http://schemas.microsoft.com/ws/2008/06/identity/claims/role"

所以:

  • 是否有替代方法可以对JWT进行编码来避免此问题? (无需自定义编码整个身份验证层)。
  • 专门针对角色声明,能否以某种方式重命名其键?运行时提供了有用的自动检测和在Identity中使用。我想继续使用此功能,以某种方式重命名声明的密钥。

2 个答案:

答案 0 :(得分:1)

我认为这有点牵强,因为这些类型来自较旧的WIF。因此,他们没有指向asp.net核心。

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

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

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

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

答案 1 :(得分: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”的

也添加为“角色”。这对我有用。