如何在IdentityServer4运行时动态连接/断开外部OpenID提供商?
问题背景
官方文档中给出了在Startup阶段配置OpenID Connect认证的示例:
要为MVC应用添加OpenID Connect认证支持,首先需要……然后在Startup类的ConfigureServices方法中添加以下代码:
services.AddAuthentication(options => { options.DefaultScheme = "Cookies"; options.DefaultChallengeScheme = "oidc"; }) .AddCookie("Cookies") .AddOpenIdConnect("oidc", options => { options.Authority = "https://localhost:5001"; options.ClientId = "mvc"; options.ClientSecret = "secret"; options.ResponseType = "code"; options.SaveTokens = true; });
该示例是在服务器启动时完成外部提供商的配置,那么能否在服务器运行期间动态连接或断开外部OpenID提供商?
解决方案
默认情况下,ASP.NET Core的认证系统是在启动阶段(ConfigureServices)完成方案注册的,运行时无法直接修改已注册的认证方案,但可以通过以下几种变通方式实现动态管理:
自定义动态认证方案提供器
实现IAuthenticationSchemeProvider接口,自定义一个可以实时从数据库、配置中心等源读取提供商配置的方案提供器。通过这个提供器,可以在运行时动态添加或移除OpenID Connect认证方案。需要注意处理好方案的缓存机制和并发访问的线程安全问题。利用配置监视器动态更新方案选项
预先注册通用的OpenID Connect方案模板,然后使用IOptionsMonitor<OpenIdConnectOptions>来监听配置变化。当外部提供商的信息(如Authority、ClientId等)更新时,直接修改对应方案的配置选项,实现动态调整连接参数的效果。请求级动态选择认证方案
如果需求是根据不同请求选择不同的外部提供商,可以在认证中间件之前添加自定义逻辑,根据请求上下文动态设置DefaultChallengeScheme,或者在发起认证挑战时指定具体的方案名称。这种方式并非真正“断开”提供商,而是动态选择使用已注册的某个方案。
注意事项
- 动态修改认证配置后,已存在的用户会话不会自动失效,需要手动触发会话刷新或强制用户重新认证,确保新配置生效。
- 所有动态操作必须保证线程安全,避免并发场景下出现配置不一致的问题。
内容的提问来源于stack exchange,提问作者Magicion

