OpenIddict自定义SSO提供者签名验证失败问题求助
检查JWKS端点的可达性与格式
手动请求你配置的JwksUri,确认返回的JSON是标准JWKS结构——必须包含keys数组,每个密钥条目要有kty、alg、kid这些必填字段。同时排查客户端能否正常访问该端点:开启日志(AddOpenIddict().AddClient().AddLogging())查看是否有JWKS获取失败的记录,或者检查网络防火墙、代理是否拦截了请求。核对令牌
kid与JWKS密钥的匹配度
解码拿到的access token(注意不要泄露敏感信息),查看header里的kid值。对比JWKS返回的keys数组,确认存在kid完全一致的密钥。如果不匹配,要么是SSO服务端签令牌用的密钥没同步到JWKS,要么是客户端获取的JWKS不是最新版本。检查客户端密钥加载逻辑
要是手动设置了JsonWebKeySet,通过断点调试查看JsonWebKeySet.GetSigningKeys()是否返回有效密钥集合,确认传入的JWKS对象解析正确。使用SetJwksUri的话,要保证URI是绝对路径、拼写无错误。另外OpenIddict默认会缓存JWKS,要是最近更换了SSO服务端密钥,可通过重启服务或者配置缓存过期时间来清除缓存。确认签名算法与密钥类型匹配
查看令牌header里的alg字段(比如RS256、HS256),对应JWKS里的密钥必须支持该算法:RS256需要用RSA类型密钥(kty为RSA),HS256需要用对称密钥(kty为oct)。算法不匹配的话,哪怕密钥存在也会导致验证失败。排查
ValidateTokenContext的自定义逻辑
检查你在ValidateTokenContext事件中有没有自定义处理,会不会无意中清空了密钥集合或者修改了验证参数。比如是否存在类似下面的错误操作:options.AddEventHandler<OpenIddictClientEvents.ValidateTokenContext>(context => { // 这里有没有影响密钥加载的代码? return default; });验证密钥配置的绑定对象
如果你有多个客户端提供者,要确认密钥相关配置(SetJwksUri/SetJsonWebKeySet)是绑定到当前自定义SSO的那个提供者上,避免配错对象。
内容的提问来源于stack exchange,提问作者Daniel Kidd

