C# 无法验证JWT或使用IdentityServer4访问API中的_令牌

C# 无法验证JWT或使用IdentityServer4访问API中的_令牌,c#,authentication,asp.net-core,identityserver4,openid-connect,C#,Authentication,Asp.net Core,Identityserver4,Openid Connect,我正在构建一些新的功能,我们有一个现有的系统。我们的目标是让不同的Angular SPA与API通信,为我们的传统应用程序提供一个新的接口。一个团队已设置IdentityServer4以使用旧应用程序进行凭据验证 SPA用Angular 7编写,使用隐式流进行身份验证。响应类型为“token id_token”。我已经能够使此流正常工作,因为我可以让未经身份验证的用户访问站点,进入IdentityServer身份验证屏幕,使用正确的凭据登录,然后重定向回应用程序。当我取回令牌时,claims对象

我正在构建一些新的功能,我们有一个现有的系统。我们的目标是让不同的Angular SPA与API通信,为我们的传统应用程序提供一个新的接口。一个团队已设置IdentityServer4以使用旧应用程序进行凭据验证

SPA用Angular 7编写,使用隐式流进行身份验证。响应类型为“token id_token”。我已经能够使此流正常工作,因为我可以让未经身份验证的用户访问站点,进入IdentityServer身份验证屏幕,使用正确的凭据登录,然后重定向回应用程序。当我取回令牌时,claims对象的
aud
只有一个值,即SPA的客户机id,例如SPA客户机。access_令牌和id_令牌都是一个JWT,其签名方法为RS256。最后,我在SPA中创建了一个拦截器来发送JWT(实际上它只使用返回的任何值作为访问令牌)作为API请求上的“承载”令牌

我现在创建了一个.NET Core 2.2 WebApi应用程序,以构建SPA使用的服务API。这个应用程序使用IdentityServer4.AccessTokenValidation包来“保护”我在IdentityServer4文档中读过的API。在我的
ConfigureServices
方法中,我编写了以下内容来配置身份验证:

服务
.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
.AddIdentityServerAuthentication(选项=>
{
如果(string.IsNullOrWhiteSpace(serviceConfiguration.Authentication.Authority))抛出新的ConfigurationException(“,nameof(serviceConfiguration.Authentication.Authority)”,则“必须定义一个权限”);
如果(string.IsNullOrWhiteSpace(serviceConfiguration.Authentication.ApiName))抛出新的ConfigurationException(“,nameof(serviceConfiguration.Authentication.ApiName)”,则“必须定义一个api名称。”;
options.Authority=serviceConfiguration.Authority;
options.ApiName=serviceConfiguration.Authentication.ApiName;
if(!string.IsNullOrWhiteSpace(serviceConfiguration.Authentication.ApiSecret))
{
options.ApiSecret=serviceConfiguration.Authentication.ApiSecret;
}
options.RequireHttpsMetadata=false;
options.SupportedTokens=SupportedTokens.Both;
}
serviceConfiguration
是my JSON appsettings.JSON的强类型表示

我的理解是使用
options.SupportedTokens=SupportedTokens。两者都将检查JWT并进行内省

现在,所有这些都已经设置好了,我采用了由API模板创建的简单示例
ValuesController
,并向其添加了
[Authorize]
属性。在Postman中对该端点执行一个简单的GET请求会返回一个401,正如我所期望的那样

接下来,我尝试登录SPA并进入一个测试页面,该页面将执行相同的操作,但拦截器将具有承载令牌、访问令牌或基本上是JWT。我仍然从服务中获得401

查看服务输出的日志,我看不到任何有帮助的具体内容:

信息:Microsoft.AspNetCore.Hosting.Internal.WebHost[1] 请求启动HTTP/1.1选项信息: Microsoft.AspNetCore.Hosting.Internal.WebHost[1] 请求启动HTTP/1.1选项信息: Microsoft.AspNetCore.Cors.Infrastructure.CorsService[4] CORS策略执行成功。信息:Microsoft.AspNetCore.CORS.Infrastructure.CorsService[4] CORS策略执行成功。信息:Microsoft.AspNetCore.Hosting.Internal.WebHost[2] 请求在61.1352ms 204信息中完成:Microsoft.AspNetCore.Hosting.Internal.WebHost[2] 请求在61.1272ms 204信息中完成:Microsoft.AspNetCore.Hosting.Internal.WebHost[1] 请求启动HTTP/1.1获取应用程序/json信息: Microsoft.AspNetCore.Hosting.Internal.WebHost[1] 请求启动HTTP/1.1获取应用程序/json信息: Microsoft.AspNetCore.Cors.Infrastructure.CorsService[4] CORS策略执行成功。信息:Microsoft.AspNetCore.CORS.Infrastructure.CorsService[4] CORS策略执行成功。信息:Microsoft.AspNetCore.Routing.EndpointMiddleware[0] 正在执行端点的Examples.TestApp.API.Web.Controllers.ValuesController.Get (示例.TestApp.API.Web)“信息: Microsoft.AspNetCore.Routing.EndpointMiddleware[0] 正在执行端点的Examples.TestApp.API.Web.Controllers.ValuesController.Get (示例.TestApp.API.Web)“信息: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1] 与{action=“Get”,controller=“Values”}匹配的路由。正在执行操作 Examples.TestApp.API.Web.Controller.ValuesController.Get (示例.TestApp.API.Web)信息: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1] 与{action=“Get”,controller=“Values”}匹配的路由。正在执行操作 Examples.TestApp.API.Web.Controller.ValuesController.Get (示例.TestApp.API.Web)信息: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] 授权失败。信息:Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] 授权失败。信息:Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[3] 在筛选器“Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter”处对请求的授权失败。信息: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[3] 在筛选器“Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter”处对请求的授权失败。信息: Microsoft.AspNetCore.Mvc.ChallengeResult[1] 使用身份验证方案()执行ChallengeResult。信息:Microsoft.AspNetCore.Mvc.ChallengeResult[1] 使用身份验证方案()执行ChallengeResult。信息:IdentityServer4.Acces
GET /connect/authorize/callback?client_id=js&redirect_uri=http%3A%2F%2Flocalhost%3A5003%2Fcallback.html&response_type=id_token%20token&scope=openid%20profile%20api1&state=xxxxxxxxxxxxxxx&nonce=xxxxxxxxxxxxxxxxxxx