【发布时间】:2020-05-08 15:18:01
【问题描述】:
我正在使用 IdentityModel.Tokens.Jwt 在我的 WindowsService 中生成 JWT 令牌,如下所示:
private JwtSecurityToken GetJwtToken()
{
var symmetricSecurityKey = new SymmetricSecurityKey(Convert.FromBase64String(_secretKey));
var signingCredentials = new SigningCredentials(symmetricSecurityKey, SecurityAlgorithms.HmacSha256Signature);
return new JwtSecurityToken(
"myIssuer",
expires: DateTime.Now.AddMinutes(15),
signingCredentials: signingCredentials
);
}
然后,我用JwtSecurityTokenHandler 编写该令牌并将其发送到WebAPI 控制器的请求中:
//some code...
// _tokenHandler below is a JwtSecurityTokenHandler
_httpClient.DefaultRequestHeaders.Add("jwtToken", _tokenHandler.WriteToken(GetJwtToken()));
HttpResponseMessage response = await _httpClient.GetAsync(url);
//...
在 API 方面,我正在尝试验证令牌:
public bool Authenticate(string token)
{
if (string.IsNullOrEmpty(token))
throw new ArgumentEmptyException(nameof(token));
TokenValidationParameters parameters = new TokenValidationParameters
{
ValidIssuer = "myIssuer",
ValidateIssuer = true,
ValidateLifetime = true,
IssuerSigningKey = new SymmetricSecurityKey(Convert.FromBase64String(SecretKey))
};
try
{
new JwtSecurityTokenHandler().ValidateToken(token, parameters, out SecurityToken validatedToken);
return true;
}
catch (SecurityTokenException)
{
return false;
}
}
}
这会引发以下错误:
IDX12741:JWT:'[PII 已隐藏。有关更多详细信息,请参阅 https://aka.ms/IdentityModel/PII.]' 必须具有三个段 (JWS) 或 五段(JWE)。'
还有一个生成令牌的例子,它实际上看起来像一次发送的两个令牌,这让我感到莫名其妙:
eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1Nzk2OTc3NzUsImlzcyI6Im15SXNzdWVyIn0.g9Mw7FijNzAzGofll5E44B8cJtOozln3nUjHKgnkdTs,
eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1Nzk2OTc3ODAsImlzcyI6Im15SXNzdWVyIn0.Noc3lC0h_ryH6axlQJ2Kk2a8wcp5eQ0QhBqidfjuujo
有什么建议吗?
【问题讨论】:
-
第一个标记真的以逗号结尾吗?还是你提问时误加的?
-
我相信这是两个用逗号连接的标记。但是当我将它们中的每一个(没有逗号或空格)粘贴到 jwt.io 中时,我仍然得到签名无效的信息。
-
@dzenesiz:您需要先将机密粘贴到 jwt.io,然后再粘贴令牌。在不知道秘密的情况下,jwt.io 无法验证签名
-
@jps 哦,不知道。我认为这只是在验证格式。会试试的,谢谢。
-
我认为从您上面显示的代码中,没有人可以告诉您为什么有两个令牌。你如何从客户端发送它们?两个标记的唯一区别是 exp(5 秒的差异)。也许它们来自两个请求,而您的客户端不会覆盖旧请求,而是将令牌附加到存储的请求中。
标签: c# asp.net-mvc jwt asp.net-apicontroller identitymodel