我正在尝试使用.Net Core 2.1应用程序的JwtSecurityTokenHandler
命名空间中的Microsoft.IdentityModel.Tokens
验证从Okta收到的access_token。
为简单起见,我将Okta应用设置为支持资源所有者密码流,然后使用以下命令获取访问令牌:
var response = await $"{openIdDomain}oauth2/default/v1/token"
.WithBasicAuth(client_id,client_secret)
.PostUrlEncodedAsync(new {
grant_type = "password",
scope = "openid",
username = u,
password = p
}).ReceiveJson();
string access_token = response.access_token;
(我正在使用Flurl.Http在发布UrlEncoded值时润滑滑轨。)
变量client_id
,client_secret
,u
,p
的设置正确,并且我确实收到有效的access_token作为回报。
要验证令牌,我需要获取应用程序的元数据
var configEndpoint = $"{openIdDomain}.well-known/openid-configuration";
IConfigurationManager<OpenIdConnectConfiguration> configurationManager =
new ConfigurationManager<OpenIdConnectConfiguration>(configEndpoint,
new OpenIdConnectConfigurationRetriever());
TokenValidationParameters validationParameters = new
TokenValidationParameters
{
ValidIssuer = openIdDomain,
ValidAudiences = new[] { "api://default" },
IssuerSigningKeys = openIdConfig.JsonWebKeySet.Keys
};
OpenIdConnectConfiguration openIdConfig = await configurationManager.GetConfigurationAsync(CancellationToken.None);
最后,我使用
验证令牌SecurityToken validatedToken;
JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
var user = handler.ValidateToken(access_token, validationParameters, out validatedToken);
var userId = user
.Claims
.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier)?.Value
?? "Missing";
ValidateToken
调用会抛出一个SecurityTokenSignatureKeyNotFoundException
。看着openIdConfig.SigningKeys
似乎那里没有键,但是当我使用PostMan获取.well / openid配置时我得到了jwks_uri,然后当我开始尝试时,得到了我期望的钥匙。
所以我不知道我是否能够通过该过程获取密钥,为什么使用GetConfigurationAsync在幕后没有发生这种情况。我一定想念什么,但是我不确定。