SignalR+OpenIddict刷新令牌后身份验证失败问题排查
问题排查与解决方案
针对你遇到的令牌刷新后Introspection验证成功但身份未认证的问题,可从以下几个方向排查修复:
1. 确认刷新后访问令牌的受众(Audience)正确性
首次令牌正常说明初始配置的Audience匹配,但刷新流程中,认证服务器可能未给新颁发的访问令牌包含目标资源服务器的Audience。需检查认证服务器的刷新令牌逻辑,确保返回的新访问令牌Audience列表包含resourceServerSettings.Name指定的值。
2. 修复ClaimsPrincipal的身份认证状态
OpenIddict的Introspection在部分场景下不会自动将验证后的声明标记为已认证,可通过自定义IClaimsTransformation强制设置身份认证状态:
services.AddScoped<IClaimsTransformation, CustomClaimsTransformer>(); public class CustomClaimsTransformer : IClaimsTransformation { public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal) { if (!principal.Identity.IsAuthenticated) { // 基于现有声明创建已认证的Identity,指定认证方案为OpenIddict var authenticatedIdentity = new ClaimsIdentity( principal.Claims, OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme); return Task.FromResult(new ClaimsPrincipal(authenticatedIdentity)); } return Task.FromResult(principal); } }
3. 确保SignalR重连时令牌传递格式正确
验证SignalR重连时,新令牌是否以Bearer {token}的格式正确放入请求的Authorization头中。部分重连逻辑可能仅传递令牌字符串而缺少Bearer前缀,导致身份验证中间件无法正确识别令牌类型。
4. 明确指定授权策略使用OpenIddict验证方案
在授权配置中显式指定使用OpenIddict的验证方案,避免默认策略未关联正确的认证逻辑:
services.AddAuthorization(options => { options.DefaultPolicy = new AuthorizationPolicyBuilder( OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme) .RequireAuthenticatedUser() .Build(); });
5. 检查证书与令牌加密/签名一致性
确认认证服务器刷新令牌时,新访问令牌的签名/加密方式与资源服务器配置的证书匹配。可在认证服务器日志中查看令牌颁发时使用的证书指纹,与资源服务器加载的encryptionCert、signingCert指纹对比,确保两者一致。
内容的提问来源于stack exchange,提问作者James Hancock
相关产品推荐
相关产品推荐

