我应该如何发送额外的授权 ID?

Posted

技术标签:

【中文标题】我应该如何发送额外的授权 ID?【英文标题】:How should I send additional authorization id? 【发布时间】:2021-11-15 10:27:44 【问题描述】:

我有一个案例,在每个发往 api 的请求中都有类似的属性

public Guid CompanyId get; set;

然后使用 JWT 令牌中的 UserId 检查用户是否有权访问该特定公司。

我不希望该属性出现在每次调用 api 中。有没有更好的方法来解决这个问题,比如在 JWT 令牌中创建自定义声明?

它变得有点复杂,因为用户可以访问不止一家公司,所以如果我要使用自定义声明,有没有办法刷新令牌并更改其中的声明值?

【问题讨论】:

你当然可以将它添加到JWT中,只需在线查看如何操作即可。如果用户可以访问多家公司,则将所有公司 ID 放入 JWT 中,然后根据 JWT 检查选择的公司(当然比数据库快)可能是有意义的。否则,创建一个新的 JWT 可能是有意义的,但您实际上需要注销和登录用户,具体取决于您的流程(如果从移动应用程序、Web 应用程序、MVC 等消费) 【参考方案1】:

您可以使用类似的功能为您的用户颁发令牌并传入当前会话公司 ID 并将其添加到他们的声明中

public string IssueToken(Guid userId, Guid companyId)

  
  SigningCredentials siginingCredentials = new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes("SuperSecretKey")), SecurityAlgorithms.HmacSha256Signature);

  JwtSecurityToken token = new JwtSecurityToken(
    issuer: "Issuer",
    audience: "Audience",
    expires: DateTime.UtcNow.AddMinutes(5),
    signingCredentials: siginingCredentials,
    claims: new List<Claim>
            

                new Claim("companyId",companyId.ToString()),
                new Claim(JwtRegisteredClaimNames.Sub,userId.ToString())
            
   );

   return new JwtSecurityTokenHandler().WriteToken(token);

然后您可以使用 HttpContextAccessor 访问它们

Guid? UserId = Guid.Parse(_httpContextAccessor.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier));
Guid? CompanyId = Guid.Parse(_httpContextAccessor.HttpContext.User.FindFirstValue("companyId"));

【讨论】:

以上是关于我应该如何发送额外的授权 ID?的主要内容,如果未能解决你的问题,请参考以下文章

我应该将 id 令牌从我的 SPA 发送到我的 rest 后端吗?

条带结帐发送额外参数

WebSocket 发送有关连接的额外信息

如何使用 Angular 2 发送 OAuth2 的客户端 ID 和秘密 ID?

从 Flutter Web 应用程序发送 Firebase 存储授权作为 url 参数

如何使用 axios 发送授权标头