【问题标题】:Override claims' key names used in JWTs in ASP.NET Core覆盖 ASP.NET Core 中 JWT 中使用的声明键名
【发布时间】:2019-09-30 16:04:31
【问题描述】:

最好不要将实现细节泄露给系统的客户端。例如,不响应“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


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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 我刚试过这个,不幸的是 JWT 仍然将角色声明的密钥显示为"http://schemas.microsoft.com/ws/2008/06/identity/claims/role"。不过谢谢!
      • 也许我做得不对,但据我了解,这不会改变角色声明的名称。但是,我可以使用声明代替角色,并将角色声明命名为我想要的任何名称 - 但是在这种情况下,我不能依靠 Identity 自动为我连接授权。也许我不明白你的解决方案?
      • 是的,这个想法是将角色作为声明添加,事实上已经发生了。没有角色,只有角色类型的声明。如果 Identity 没有为您自动添加声明,那么您可能需要添加一些代码,例如实现 IUserClaimStore。还要确保在创建令牌时包含声明类型。声明可能会被过滤或简单地忽略,但这取决于设计。
      • 是的,这就是我的想法,但这意味着重新实现核心身份功能,这是困难的(也是我想要避免的)。不过感谢您的建议!
      猜你喜欢
      • 2018-05-08
      • 1970-01-01
      • 2019-04-14
      • 2018-12-24
      • 2018-07-01
      • 2018-06-16
      • 2023-03-23
      • 2017-07-10
      • 2019-04-15
      相关资源
      最近更新 更多