IdentityModel/IdentityServer4验证会话有效性时内省返回未认证错误
问题原因及解决方案
核心原因(出现概率最高)
内省端点的认证凭证使用错误。IdentityServer的令牌内省端点要求使用API资源的凭证进行认证,而非你申请令牌时使用的客户端(Client)凭证。你当前代码中TokenIntrospectionRequest传入的ClientId、ClientSecret是客户端的凭证,自然会被内省端点判定为未认证。
其他可能原因
- IdentityServer侧未给对应API资源配置Secret,或配置的Secret与请求时传入的不匹配
- 令牌的
aud(受众)声明不包含你用于调用内省端点的API资源名称 - 你使用的
HttpClient实例提前携带了其他Authorization请求头,和内省请求自动生成的认证头冲突 - IdentityServer配置了内省端点仅允许HTTPS访问,你使用HTTP地址请求被拦截
对应解决步骤
- 首先检查IdentityServer配置,确保你要保护的API资源(对应你代码中申请的
api1scope)已经配置了ApiSecret,示例配置参考:
// IdentityServer侧配置 new ApiResource("api1", "我的API资源") { Scopes = { "api1" }, ApiSecrets = { new Secret("your_api_secret".Sha256()) } }
- 修改内省请求的凭证,将原来的客户端
ClientId、ClientSecret替换为API资源的名称和对应Secret:
var introspectionResponse = await _http.IntrospectTokenAsync(new TokenIntrospectionRequest { Address = discovery.IntrospectionEndpoint, ClientId = "api1", // 替换为你的API资源名称,不是客户端ID ClientSecret = "your_api_secret", // 替换为你给API资源配置的Secret Token = response.AccessToken });
- 排查
HttpClient实例是否有全局默认认证头配置,如果有可以在发起内省请求前清空,或者使用新的HttpClient实例发起内省请求 - 本地测试时如果使用HTTP地址,确保IdentityServer配置中关闭了HTTPS强制校验,开发环境可添加如下配置:
builder.Services.AddIdentityServer(options => { options.Authority = "http://localhost:5000"; options.RequireHttpsMetadata = false; // 开发环境关闭HTTPS要求 }) // 其余配置...
内容的提问来源于stack exchange,提问作者eltiare
相关产品推荐
相关产品推荐

