ASP.NET Core:基于请求主机动态配置OpenId Connect认证
基于请求主机动态配置OpenID Connect ClientId的可行方案
方案一:通过PostConfigure动态修改配置(推荐)
不用折腾MapWhen,直接在ASP.NET Core的认证配置流程里,根据请求主机动态调整ClientId:
- 先注册基础的认证服务,包括Cookie和OpenID Connect的通用配置:
builder.Services.AddAuthentication(options => { options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; }) .AddCookie() .AddOpenIdConnect(options => { options.Authority = "https://你的认证服务器地址"; options.CallbackPath = "/signin-oidc"; options.ClientId = "默认web端clientId"; // 先设个默认值 }); // 注册HttpContextAccessor,用来获取当前请求的主机信息 builder.Services.AddHttpContextAccessor(); // 添加动态配置逻辑,在配置生效前替换ClientId builder.Services.PostConfigure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options => { var httpContext = builder.Services.BuildServiceProvider().GetRequiredService<IHttpContextAccessor>().HttpContext; if (httpContext != null && httpContext.Request.Host.Host.StartsWith("tv.", StringComparison.OrdinalIgnoreCase)) { options.ClientId = "TV端对应的clientId"; } });
方案二:在跳转事件中动态设置ClientId
如果需要更细粒度的控制,比如只在跳转认证服务器时修改ClientId,可以用OpenID Connect的事件钩子:
builder.Services.AddAuthentication() .AddCookie() .AddOpenIdConnect(options => { options.Authority = "https://你的认证服务器地址"; options.CallbackPath = "/signin-oidc"; options.Events = new OpenIdConnectEvents { OnRedirectToIdentityProvider = context => { // 根据请求主机判断,替换ClientId if (context.Request.Host.Host.StartsWith("tv.", StringComparison.OrdinalIgnoreCase)) { context.ProtocolMessage.ClientId = "TV端对应的clientId"; } else { context.ProtocolMessage.ClientId = "默认web端clientId"; } return Task.CompletedTask; } }; });
关于MapWhen失效的原因
MapWhen是用来拆分中间件管道分支的,如果你之前用它分别配置两套OpenID认证,很可能因为管道分支的匹配逻辑问题,导致部分请求走不到对应的认证流程。上面的两种方案都是在同一个认证管道内动态调整参数,完全不需要拆分项目,更适配你的需求。
内容的提问来源于stack exchange,提问作者Thomas KiTe Trentin
相关产品推荐
相关产品推荐

