невозможно проверить Okta access_token - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь проверить токен доступа, который я получаю от 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. Должно быть, я что-то упустил, но я не уверен, что.

...