【问题标题】:Access Claims data from JWT Auth Token in web api从 Web api 中的 JWT Auth Token 访问声明数据
【发布时间】:2021-08-14 07:14:18
【问题描述】:
string Accesstoken = "Token";
string key = "my_secret_key_12345"; //Secret key which will be used later during validation    
var issuer = "SiteURL";  //normally this will be your site URL    
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var jwt_token = new JwtSecurityTokenHandler().ReadJwtToken(token);
string claims = string.Join(";", jwt_token.Claims);

上面的代码正在从令牌中读取我的声明数据。我需要将此声明分配给以下参数,而不是 Guid.Parse(authParams[0]) 需要将其从声明中分配。TenantId 类似这样。

TenantId =  Guid.Parse(authParams[0]),
Env = authParams[1],
UserId = Guid.Parse(authParams[2]),
SessionId = Guid.Parse(authParams[3]),
EmployeeID = int.Parse(authParams[4]),
Language = language,
TimezoneOffset = timezoneOffset

【问题讨论】:

  • 您能否在问题中包含有关您所面临问题的更多详细信息?毕竟,不就是迭代jwt_token.Claims,直到找到类型为“TenantId”的那个,然后保存该值吗?
  • 我无法将数据分配给我上面的参数。我可以从令牌中读取声明,在分配它时需要帮助。我的读取令牌返回此 {“jti”:“1109777c-2d71-4bea-91f3-bc3040d084a9”,“TenantId”:“8B6AAF27-CAB0-4D45-A22A-293A40C7983A”,“Env”:“IDB”,“UserId”: “77777777-7777-7777-7777-777777777777”,“SessionId”:“530c9d45-f371-4950-9fad-de0c6f409abf”,“EmployeeID”:“0”,“exp”:1622085870,“iss”:“URL”, "aud": "URL" }
  • authParams 来自哪里?为什么不能从jwt_token.Claims 中的适当声明中分配值?请展示您这样做的尝试(作为对您的问题的编辑,而不是作为评论)。在我看来,它只是string tenantIdText = jwt-token.Claims.FirstOrDefault("TenantId")?.Value;。您能否更具体地说明为什么这还不够?
  • 好的!我尝试过这种方式 TenantId = jwt_token.Claims.FirstOrDefault("TenantId")?.Value,但由于无法从字符串转换为 System.Func 出现错误
  • cmets 中有很多我应该在原始帖子中的数据。你能修改帖子吗...尤其是变量authparams

标签: c# asp.net asp.net-mvc asp.net-web-api


【解决方案1】:

您应该能够像这样检索声明:

var jwt_token = new JwtSecurityTokenHandler().ReadJwtToken(token);
var tenantIdClaim = jwt_token.Claims.SingleOrDefault(c => c.Type == "TenantId");

如果声明不存在,tenantIdClaim 将是 null,因此您应该检查此项。或者,您可以使用.Single(c => c.Type == "TenantId"),如果声明不存在,它将抛出InvalidOperationException

然后就可以解析并赋值给TenantId

TenantId = Guid.Parse(tenantIdClaim.Value);

请注意,如果 tenantIdClaim 没有有效的 GUID,Guid.Parse 将抛出 FormatException。如果这对您来说是一个问题,您可以使用TryParse。示例在链接文档页面的下方。e

【讨论】:

  • @Llama 不应该是TenantId = Guid.Parse(tenantIdClaim.Value); 吗?
  • @AkshayGaonkar 是的,应该。谢谢! :)
猜你喜欢
  • 1970-01-01
  • 2015-04-28
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 2018-06-21
  • 2018-03-04
  • 2021-03-10
相关资源
最近更新 更多