使用JwtBearerAuthentication签名密钥

时间:2016-07-15 11:03:36

标签: c# asp.net asp.net-core openid-connect okta

我正在尝试使用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获取签名密钥。我不认为这种情况正在发生。我需要做些什么才能找到并使用签名密钥?感谢

1 个答案:

答案 0 :(得分:10)

在关注引用并深入研究AspNet Security repo(特别是JwtBearerHandlerJwtBearerMiddleware类)之后,这导致了 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

...所以我无法使用访问令牌。