You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core:基于请求主机动态配置OpenId Connect认证

基于请求主机动态配置OpenID Connect ClientId的可行方案

方案一:通过PostConfigure动态修改配置(推荐)

不用折腾MapWhen,直接在ASP.NET Core的认证配置流程里,根据请求主机动态调整ClientId:

  1. 先注册基础的认证服务,包括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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 10:25:02