ASP.NET Core配置第二个OpenID Connect身份提供商遇问题求助
问题分析
你的配置存在两个核心问题:
- 全局默认的
DefaultChallengeScheme被设为oidc,未认证请求会自动跳转到第一个OIDC提供商,直接忽略第二个 - 第二个
OpenIdConnect("oidc2")未指定对应Cookie认证方案,默认会使用全局的cookiescheme,导致登录后的身份凭证存储与验证逻辑混乱
修正后的配置
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
相关产品推荐
相关产品推荐

