C# UseJwtBeareAuthentication签名密钥

C# UseJwtBeareAuthentication签名密钥,c#,asp.net,asp.net-core,openid-connect,okta,C#,Asp.net,Asp.net Core,Openid Connect,Okta,我试图在我的AspNetCore MVC应用程序(仅限Web API)中使用JWTbearerMiddle软件实现JWT承载身份验证,但得到了带有标题的401响应: WWW-Authenticate: Bearer error="invalid_token", error_description="The signature key was not found" Startup.cs中的相关代码如下所示: app.UseJwtBearerAuthentication(new JwtBearer

我试图在我的AspNetCore MVC应用程序(仅限Web API)中使用JWTbearerMiddle软件实现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\u uri
然后从
https://example.okta.com/oauth2/v1/keys
。我认为这不会发生。我需要做什么才能让它找到并使用签名密钥?感谢在以下引用和深入研究之后(特别是
JwtBearerHandler
JwtBearerMiddleware
类),这使我找到了Microsoft.IdentityModel命名空间,它位于一个(首先是
ConfigurationManager
类,然后是
OpenIdConnectConfigurationRetriever
类)中(
GetAsync
method),然后通过
JsonWebKeySet.GetSigningKeys()
method),我最终发现JWTbearerMiddle确实从元数据中的jwks_uri获取了密钥

那么它为什么不起作用呢?我之前应该检查的是,承载JWT头中的kid实际上与jwks_uri中的任一kid都不匹配,因此找不到它。这是我作为承载令牌发送的访问密钥。另一方面,id_令牌确实有一个匹配的kid,所以使用它相反,它成功了

我后来读到:

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


…因此我无法使用访问令牌。

您能发布异常详细信息(启用日志并查看错误日志)吗?@ademcaglin我在尝试获取这些详细信息时遇到了问题,因为这些都发生在nuget库中。我看不到断点的任何位置。