无法在 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 中验证身份服务器令牌的主要内容,如果未能解决你的问题,请参考以下文章
如何使用默认域在 Web.config 中启用基本身份验证和匿名身份验证?
在 Asp.Net Core Web 应用程序中使用 EasyAuth 对 Azure 应用服务上的 AAD 进行身份验证时,无法填充 ClaimsPrincipal