我应该如何发送额外的授权 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 后端吗?
如何使用 Angular 2 发送 OAuth2 的客户端 ID 和秘密 ID?