.NET Core API对接IdentityServer4:发现端点自定义头注入问题求方案
解决方法
方法1:手动配置ConfigurationManager注入自定义IDocumentRetriever
默认情况下AddOpenIdConnect不会自动复用你注册的IDocumentRetriever实现,需要手动实例化ConfigurationManager<OpenIdConnectConfiguration>并指定自定义检索器,再绑定到OIDC配置选项中:
services.AddAuthentication(options => { options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddOpenIdConnect(options => { options.Authority = "你的IdentityServer实例地址"; options.ClientId = "你的客户端ID"; // 实例化自定义文档检索器 var customRetriever = new AppHttpDocumentRetriever(); // 创建ConfigurationManager并传入发现地址、配置检索器和自定义文档检索器 options.ConfigurationManager = new ConfigurationManager<OpenIdConnectConfiguration>( $"{options.Authority}/.well-known/openid-configuration", new OpenIdConnectConfigurationRetriever(), customRetriever ); });
这样就能确保发现文档的请求会使用你的AppHttpDocumentRetriever,从而带上自定义请求头。
方法2:给Backchannel HttpClient添加定向请求头处理器
如果不想修改ConfigurationManager的实例化逻辑,可以给OIDC的Backchannel HttpClient添加自定义DelegatingHandler,仅针对发现端点的请求添加头:
- 先实现自定义Handler:
public class DiscoveryHeaderHandler : DelegatingHandler { protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { // 判断请求是否指向发现文档端点 if (request.RequestUri.AbsolutePath.EndsWith("/.well-known/openid-configuration", StringComparison.OrdinalIgnoreCase)) { request.Headers.Add("你的自定义头名称", "对应头值"); } return await base.SendAsync(request, cancellationToken); } }
- 在OIDC配置中绑定该Handler:
services.AddAuthentication(options => { options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddOpenIdConnect(options => { options.Authority = "你的IdentityServer实例地址"; options.ClientId = "你的客户端ID"; // 为Backchannel HttpClient配置自定义Handler options.BackchannelHttpHandler = new DiscoveryHeaderHandler(); });
这种方式无需改动配置管理器的初始化逻辑,仅定向处理发现文档的请求。
内容的提问来源于stack exchange,提问作者Oleh
相关产品推荐
相关产品推荐

