无法验证Okta access_token

时间:2018-09-14 15:56:04

标签: .net-core asp.net-identity openid-connect okta

我正在尝试使用.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_idclient_secretup的设置正确,并且我确实收到有效的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在幕后没有发生这种情况。我一定想念什么,但是我不确定。

0 个答案:

没有答案