无法在 dotntecore web 中验证身份服务器令牌

Posted

技术标签:

【中文标题】无法在 dotntecore web 中验证身份服务器令牌【英文标题】:unable to validate identity server token in dotntecore web 【发布时间】:2021-06-28 09:30:40 【问题描述】:

我有一个类似于 Microsoft 默认模板的 Asp.netCoreWebApplication->ASP.netCoreWithReact.js 的应用程序。

在这个反应客户端将被包装在一个 .netcore 项目中。所有的 UI 页面都将由 React 提供。 .Net 核心后端将仅用于 API。

现在我已经实现了 IdentityServer4 并且能够在这个端点生成令牌, http://localhost:60739/token

从反应客户端,点击登录按钮,我可以对 http://localhost:60739/token 进行 API 调用,并可以使用授权类型密码流生成令牌。但我无法使用该令牌验证我的 api 端点

以下是我在身份服务器解决方案中的客户端定义,

  new Client
           
             ClientName = "Resource Owner Flow",
             ClientId = "resource_owner_flow",
             AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,
             ClientSecrets =
             
               new Secret("resource_owner_flow_secret".Sha256())
             ,
             AllowedScopes =
             
               IdentityServerConstants.StandardScopes.OpenId,
               IdentityServerConstants.StandardScopes.OfflineAccess
             ,
             AllowOfflineAccess = true,
             RefreshTokenUsage = TokenUsage.ReUse,
             //AccessTokenLifetime = 60,
             RefreshTokenExpiration = TokenExpiration.Absolute,
             AbsoluteRefreshTokenLifetime = 300
           

下面是我用来引用身份服务器的一段代码,

 services.AddAuthentication("Bearer")
        .AddJwtBearer("Bearer", options =>
        
            options.Authority = "http://localhost:60739";
            options.TokenValidationParameters.ValidateAudience = false;
            options.TokenValidationParameters.ValidateIssuer = false;
            options.TokenValidationParameters.ValidateIssuerSigningKey = false;
            options.TokenValidationParameters.ValidateLifetime = false;
            options.TokenValidationParameters.ValidateTokenReplay = false;
            options.IncludeErrorDetails = true;
        );

我无法成功访问受保护的 api 资源?有什么想法吗?

如果我使用标头中的令牌调用 http://localhost:57102/api/Home/GetSomeProtectedData,我会收到 500 内部服务器错误。如果我删除受保护资源上的授权属性,它工作正常。

以下是邮递员截图,

下面是用于创建令牌的日志,

IdentityServer4.Validation.TokenRequestValidator:信息:令牌请求验证成功,

 
   "ClientId": "resource_owner",
   "ClientName": "Resource Owner",
   "GrantType": "password",
   "Scopes": "openid",
   "AuthorizationCode": "********",
   "RefreshToken": "********",
   "UserName": "superadmin@gmail.com",
   "Raw": 
      "username": "superadmin@gmail.com",
      "password": "***REDACTED***",
      "grant_type": "password",
      "scope": "openid",
      "response_type": "token"
   

但是当我请求标头中带有令牌的受保护 API 资源时,我收到 500 个内部服务器错误并创建了日志。

【问题讨论】:

出现问题时的身份记录。你能提供日志吗? 嗨 @MistGun 我在哪里可以看到这些日志? 对于令牌生成,它正在添加一些日志,但是当我请求一些 api 资源时,ntng 正在记录。 @Mahesh 出于测试目的,将 IdentityModelEventSource.ShowPII = true 代码行添加到 Startup.cs 中的 ConfigureServices 方法中,启动项目并查看 Visual Studio 中的输出控制台,您将能够阅读该特定请求/异常的日志。与我们分享,我们可以帮助您:) 嗨@krazors。当我从身份服务器端点请求创建令牌时,我可以看到上面的日志被生成了。但是,当我在标头中使用令牌从 api 端点请求受保护的 api 资源时,我暗示获得了 500 个内部服务器并且没有创建日志。让我知道是否有任何方法可以调试和查找 【参考方案1】:

如果您收到 500 错误,则问题不在于授权流程。否则将是 401。

您需要检查真正的错误是什么。这可能是解析错误。由于服务器端错误,您根本无法完成该过程。请分享更多信息,可能是日志,所以我更新答案。

【讨论】:

是的,如果我的令牌无效,它将是 401。但是在我的客户端中,如果我没有正确引用身份服务器(使用添加身份验证代码的服务器权限),那么我想这即将到来。但不确定如何在启动时从我的应用程序中引用身份服务器端点。由于找不到资源本身或配置无效,我收到 500 错误,并且在我请求受保护的 API 资源时不会生成任何日志。在创建令牌时生成的日志我已经保存在问题中 如果我通过受保护的 API 资源控制器删除 Authorize 属性,我可以获得数据

以上是关于无法在 dotntecore web 中验证身份服务器令牌的主要内容,如果未能解决你的问题,请参考以下文章

剑灵台服如何绑定二次验证码_两步验证_谷歌身份验证器?

无法使用 WCF 调用具有基本身份验证的 Web 服务

如何使用默认域在 Web.config 中启用基本身份验证和匿名身份验证?

在 Asp.Net Core Web 应用程序中使用 EasyAuth 对 Azure 应用服务上的 AAD 进行身份验证时,无法填充 ClaimsPrincipal

Flutter Web和Firebase身份验证TypeError:无法读取未定义的属性'app'

使用外部 WCF 服务时,在 docker 内运行的 Dotnet 核心 Web api 无法进行身份验证