我有一个被Azure AD保护的Web API。我能够从Azure AD获取Web API的访问令牌,并成功使用它。
我想要做的是在使用该令牌执行任何操作之前验证该令牌,以便在令牌存在问题时向用户提供有意义的错误信息。例如,我想告诉用户的一些事情是:
- 令牌是否已过期?
- 令牌是否为正确的受众获得?
- 令牌发行者是否有效?
但是,我无法这样做,因为无论令牌是否有效,我都会不断收到以下错误消息:
IDX10516: Signature validation failed. Unable to match key:
kid: 'System.String'.
Exceptions caught:
'System.Text.StringBuilder'.
token: 'System.IdentityModel.Tokens.Jwt.JwtSecurityToken'. Valid Lifetime: 'System.Boolean'. Valid Issuer: 'System.Boolean'
我成功地解析了位于
https://jwt.io
的令牌。
在那里的“Header”部分中,我看到了以下内容:
{
"typ": "JWT",
"alg": "RS256",
"x5t": "qDm8HXaLQBeSIvYXzMt8PQ_ADFt",//obfuscated
"kid": "qDm8HXaLQBeSIvYXzMt8PQ_ADFt"//obfuscated
}
另外,我也收到了如下截图所示的签名已验证
消息。
这是我编写的代码:
string authorizationToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Im5PbzNaRHJPRFhFSzFqS1doWHNsSFJfS1hFZyIsImt...";
try
{
JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();
TokenValidationParameters tokenValidationParameters = new TokenValidationParameters()
{
ValidateLifetime = true,
};
var claimsPrincipal = tokenHandler.ValidateToken(authorizationToken, tokenValidationParameters, out _);//Exception comes on this line.
}
catch (SecurityTokenExpiredException exception)
{
//Do something with the token expired exception
}
catch (SecurityTokenInvalidAudienceException exception)
{
//Do something with invalid audience exception
}
catch (Exception exception) //Code always lands in this exception block
{
//Token is invalid because of some other reason
}
正如我上面所说的,无论令牌是否有效,我的代码始终落在最后一个异常块中。
请问有人能告诉我我在这里做错了什么?需要什么才能成功验证令牌?
非常感谢任何对此的见解。