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

ASP.NET Core配置第二个OpenID Connect身份提供商遇问题求助

问题分析

你的配置存在两个核心问题:

  1. 全局默认的DefaultChallengeScheme被设为oidc,未认证请求会自动跳转到第一个OIDC提供商,直接忽略第二个
  2. 第二个OpenIdConnect("oidc2")未指定对应Cookie认证方案,默认会使用全局的cookie scheme,导致登录后的身份凭证存储与验证逻辑混乱
修正后的配置
builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = "cookie";
    options.DefaultSignInScheme = "cookie";
    // 移除全局默认的Challenge/SignOutScheme设置,改为登录时明确指定
})
// 第一个身份提供商组合:Cookie + OIDC
.AddCookie("cookie")
.AddOpenIdConnect("oidc", options =>
{
    options.Authority = AppConfig.AuthorizationServerAdress;
    options.ClientId = AppConfig.OpenidApp;
    options.ClientSecret = AppConfig.OpenidAppSecret;
    options.ResponseType = OpenIdConnectResponseType.Code;
    options.ResponseMode = OpenIdConnectResponseMode.Query;
    options.UsePkce = true;
    options.SaveTokens = true;
    options.GetClaimsFromUserInfoEndpoint = true;
    // 明确绑定对应的Cookie认证方案
    options.SignInScheme = "cookie";
})
// 第二个身份提供商组合:Cookie2 + OIDC2
.AddCookie("cookie2")
.AddOpenIdConnect("oidc2", options =>
{
    options.Authority = AppConfig.AuthorizationExternalServerAdress;
    options.ClientId = AppConfig.OpenidExternalApp;
    options.ClientSecret = AppConfig.OpenidExternalAppSecret;
    options.ResponseType = OpenIdConnectResponseType.Code;
    options.ResponseMode = OpenIdConnectResponseMode.Query;
    options.UsePkce = true;
    options.SaveTokens = true;
    options.GetClaimsFromUserInfoEndpoint = true;
    // 关键:绑定到第二个Cookie认证方案
    options.SignInScheme = "cookie2";
    // 避免回调路径冲突,指定专属回调地址
    options.CallbackPath = "/signin-oidc2";
});
补充登录路由逻辑

需要添加两个登录入口,让用户可以选择对应提供商登录:

app.MapGet("/login-company", async (HttpContext context) =>
{
    // 跳转至内部OIDC提供商
    await context.ChallengeAsync("oidc", new AuthenticationProperties { RedirectUri = "/" });
});

app.MapGet("/login-external", async (HttpContext context) =>
{
    // 跳转至外部OIDC提供商
    await context.ChallengeAsync("oidc2", new AuthenticationProperties { RedirectUri = "/" });
});
登出逻辑适配

如果需要支持对应提供商的登出,需根据当前用户的认证类型匹配对应的scheme:

app.MapGet("/logout", async (HttpContext context) =>
{
    var authScheme = context.User.Identity.AuthenticationType;
    var cookieScheme = authScheme == "oidc2" ? "cookie2" : "cookie";
    var oidcScheme = authScheme == "oidc2" ? "oidc2" : "oidc";

    await context.SignOutAsync(cookieScheme);
    await context.SignOutAsync(oidcScheme);
});
额外注意事项
  • 需确保外部OIDC提供商的后台配置中,已将/signin-oidc2添加至允许的回调域名列表
  • 可以制作一个登录选择页面,让用户点击不同按钮跳转至对应的登录路由

内容的提问来源于stack exchange,提问作者Dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:25:19