使用JwtBearerAuthentication签名密钥

Ste*_*eve 8 c# asp.net openid-connect okta asp.net-core

我正在尝试使用JwtBearerMiddleware在我的AspNetCore MVC应用程序(仅限Web API)中实现JWT承载身份验证,但我收到了401带有标头的响应:

WWW-Authenticate: Bearer error="invalid_token", error_description="The signature key was not found"
Run Code Online (Sandbox Code Playgroud)

Startup.cs中的相关代码如下所示:

app.UseJwtBearerAuthentication(new JwtBearerOptions
{
    Authority = "https://example.okta.com",
    Audience = "myClientId"
});
Run Code Online (Sandbox Code Playgroud)

与管理局的网址,我期望中间件查询我的身份提供的元数据https://example.okta.com/.well-known/openid-configuration来获取jwks_uri到然后得到从签名密钥https://example.okta.com/oauth2/v1/keys.我不认为这种情况正在发生.我需要做些什么才能找到并使用签名密钥?谢谢

Ste*_*eve 10

在按照引用并深入研究AspNet Security repo(特别是JwtBearerHandlerJwtBearerMiddleware类)之后,这导致我进入Azure Extensions repo中Microsoft.IdentityModel命名空间(首先是类,然后是类(方法),然后是方法) ),我终于发现JwtBearerMiddleware确实从元数据中的jwks_uri获取了密钥.唷.ConfigurationManager<T>OpenIdConnectConfigurationRetrieverGetAsyncJsonWebKeySet.GetSigningKeys()

那么为什么它不起作用?什么我应该早检查的是,孩子在承载JWT的头实际上没有匹配任何的孩子的从jwks_uri,因此它没有被发现.这是我作为持票人令牌发送的access_code.另一方面,id_token确实有一个匹配的孩子,所以使用它而不是它有效!

我读过:

OIDC访问令牌仅适用于Okta/oauth2/v1/userinfo端点,因此应被应用程序视为不透明.应用程序不需要验证它,因为它不应该用于其他资源服务器.它的格式和用于签名的密钥如有更改,恕不另行通知. 资源

...所以我不能使用访问令牌.