Я пытаюсь проверить токен доступа, который я получаю от Okta, используя JwtSecurityTokenHandler
в Microsoft.IdentityModel.Tokens
пространстве имен приложения .Net Core 2.1.
Для простоты я настроил приложение 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
установлены правильно, и я получаю действительный токен доступа в ответ.
Для проверки токена мне нужно получить метаданные приложения, которые я делаю с
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-known / openid, я получаю jwks_uri, а затем когда я это понимаю, я получаю ключ, который ожидаю.
Так что я не понимаю, смогу ли я получить ключи через этот процесс, почему это не происходит за кулисами, с GetConfigurationAsync. Должно быть, я что-то упустил, но я не уверен, что.