我正在尝试使用JwtBearerMiddleware在我的AspNetCore MVC应用程序(仅限Web API)中实现JWT承载身份验证,但我收到带有标题的401
响应:
WWW-Authenticate: Bearer error="invalid_token", error_description="The signature key was not found"
Startup.cs中的相关代码如下所示:
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
Authority = "https://example.okta.com",
Audience = "myClientId"
});
使用权限URL,我希望中间件从https://example.okta.com/.well-known/openid-configuration
查询我的身份提供程序元数据,以获取jwks_uri
,然后从https://example.okta.com/oauth2/v1/keys
获取签名密钥。我不认为这种情况正在发生。我需要做些什么才能找到并使用签名密钥?感谢
答案 0 :(得分:10)
在关注引用并深入研究AspNet Security repo(特别是JwtBearerHandler
和JwtBearerMiddleware
类)之后,这导致了 Microsoft.IdentityModel 命名空间,这是在Azure Extensions repo(首先是ConfigurationManager<T>
类,然后是OpenIdConnectConfigurationRetriever
类(GetAsync
方法),然后是JsonWebKeySet.GetSigningKeys()
方法),我终于发现了 JwtBearerMiddleware 确实从元数据中的 jwks_uri 获取密钥。呼。
那为什么不工作呢?我之前应该检查的是,Bearer JWT标题中的 kid 实际上并不匹配 kid 的任何一个来自 jwks_uri ,因此未找到。这是我作为持票人令牌发送的access_code。另一方面,id_token确实有匹配的 kid ,所以使用它而不是它有效!
我读完了以后:
OIDC访问令牌仅适用于Okta / oauth2 / v1 / userinfo端点因此应被视为不透明 应用程序。应用程序不需要验证它,因为它 不应该用于其他资源服务器。它的格式 用于签名的密钥如有更改,恕不另行通知 注意。 source
...所以我无法使用访问令牌。