在IdentityServer4 2.5.4(.Net Core2.1)中配置客户端Backchannel登出Basic Auth Header
问题:IdentityServer4 2.5.4 为指定客户端添加BackChannel Logout的Basic认证头
备注与场景
- 备注:已知.Net Core 2.1版本较旧,暂无法升级,升级计划已排期。
- 场景:某客户端要求请求携带Basic Authentication头,才能接收OpenId Connect的Back-Channel Logout Request。
代码分析
查看IdentityServer4 2.5.4的BackChannelLogoutHttpClient.PostAsync()方法,这是实际调用客户端的核心方法。需求明确:调用目标URL前为HttpClient添加Basic Auth头,调用完成后移除该头。
已尝试的思路及问题
思路1:继承BackChannelLogoutHttpClient重写方法
编写派生类,用new关键字重写原方法,但该类无对应接口,无法通过依赖注入替换原实现(无法使用services.AddScoped<Interface, Class>()进行配置)。
思路2:继承DefaultBackChannelLogoutService扩展
该类通过IBackChannelLogoutService接口支持依赖注入,且SendLogoutNotificationAsync()为虚方法,但存在以下问题:
思路2.1:构造函数替换BackChannelLogoutHttpClient
尝试在自定义服务类构造函数中传入自定义的BackChannelLogoutHttpClient实现后调用父类构造,但未成功。代码示例:
public class AhlcBclService: DefaultBackChannelLogoutService { public AhlcBclService( ISystemClock clock, IdentityServerTools tools, BackChannelLogoutHttpClient backChannelLogoutHttpClient, ILogger<IBackChannelLogoutService> logger) : base(clock, tools, backChannelLogoutHttpClient, logger) { // 无法实现:如何用自定义类(如"AdditionalHeaderForLogoutClient")实例替代原参数传入base构造? } }
思路2.2:反射绕过私有属性限制
尝试在重写的SendLogoutNotificationAsync()中用反射获取BackChannelLogoutHttpClient的私有_client属性,但获取到的PropertyInfo为null,无法访问目标HttpClient。代码示例:
protected override async Task SendLogoutNotificationAsync(BackChannelLogoutModel client) { PropertyInfo prop = typeof(BackChannelLogoutHttpClient).GetProperty("_client", BindingFlags.NonPublic | BindingFlags.Instance); // prop为null,找不到私有属性_client HttpClient cl = (HttpClient)prop.GetValue(HttpClient); // 本地变量HttpClient为BackChannelLogoutHttpClient实例 if (client.LogoutUri == "<urlWithAuth>") cl.SetToken("Basic", "<SomeAuthString>"); else cl.DefaultRequestHeaders.Remove("Authorization"); var data = await CreateFormPostPayloadAsync(client); await HttpClient.PostAsync(client.LogoutUri, data); }
其他尝试与当前困境
- 官方提供的
AddBackChannelLogoutHttpClient()可设置认证头,但会对所有客户端生效,无法支持多个不同认证值的客户端。 - 当前仅可行方案是使用外部中继客户端:接收logout_token后,用新的
HttpClient设置头和载荷再调用目标,但该方案不够优雅。 - 潜在可行方向:自动将
https://user:pw@url格式的登出URL转换为带Basic Auth头的https://url,但暂未找到实现方式。
疑问
是否有遗漏的更优方案?IdentityServer4 2.5.4是否有官方支持的按客户端扩展调用的方式?
内容的提问来源于stack exchange,提问作者MilConDoin
相关产品推荐
相关产品推荐

