如何在 Identity Server 4 中使用主域进行 Openid 身份验证?

Posted

技术标签:

【中文标题】如何在 Identity Server 4 中使用主域进行 Openid 身份验证?【英文标题】:How to use primary domain for Openid authentication in Identity Server 4? 【发布时间】:2021-03-20 18:39:14 【问题描述】:
    xyz.com yzx.com zxy.com

我有这些域,并且正在运行具有 AuthO Openid 连接的身份服务器 4 应用程序。我的主域是xyz.com,所以如果用户使用yzx.com等其他域登录,只有在AuthO成功登录后才会重定向到我的主域回调路径。因为我只在所有正在运行的域中注册了我的主域的回调路径。

请看下面的例子:

var primaryBrandOpenIdRedirectURL = SharedResourceConstants.HyperText + primaryBrandHostUrl + pathBase.GetPathBase(HttpContext) + sso.RedirectPath;

var openIdOptions = new OpenIdConnectOptions
                
                    ClientId = rijndaelEncryption.Decrypt(sso.ClientId),
                    ClientSecret = rijndaelEncryption.Decrypt(sso.ClientSecret),
                    Authority = sso.Authority,
                    SignInScheme = 
                     IdentityServer4.IdentityServerConstants.ExternalCookieAuthenticationScheme,
                    ForwardSignOut = sso.ForwardSignOut,

                    // Call back path should be unique.
                    CallbackPath = new PathString(sso.RedirectPath),
                ;

if (!organization.IsDefaultBrand)

    openIdOptions.Events = new OpenIdConnectEvents()
                    
                        OnRedirectToIdentityProvider = ctx =>
                        
                            ctx.ProtocolMessage.RedirectUri = primaryBrandOpenIdRedirectURL;
                            return Task.FromResult(0);
                        
                    ;

这在两个不同的本地主机端口中工作正常,但在暂存时面临以下问题。

System.Exception: 处理远程登录时遇到错误。

System.Exception:关联失败。

在 Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler`1.d__12.MoveNext() 偏移 1286 在偏移量 17 处的 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task 任务) 偏移 39 在偏移量 46 处的 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task 任务) 在 IdentityServer4.Hosting.FederatedSignOut.AuthenticationRequestHandlerWrapper.d__6.MoveNext() 偏移 437 在偏移量 17 处的 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task 任务) 偏移 39 在 Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.d__6.MoveNext() 偏移 953 在偏移量 17 处的 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(System.Threading.Tasks.Task 任务) 偏移 39 在偏移量 46 处的 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task 任务) ```

【问题讨论】:

你在本地使用HTTPS吗?分期呢? 是的,我只使用localhost:44339 和example.com 一样的分期 【参考方案1】:

问题 Correlation failed 是 OpenIDConnect 身份验证中间件收到来自 IdentityServer 的意外回调时的常见错误。

发出初始身份验证请求的客户端也必须是在用户登录并同意后浏览器被重定向回的客户端。 (即必须使用相同的域)

我猜每个客户端域都需要在有效的重定向 URL 中注册 喜欢

RedirectUris = 新列表() "https://xyz1.com/signin-oidc", "https://xyz2.com/signin-oidc", “https://xyz3.com/signin-oidc” ;

您还应该检查并确保发送到 IdentityServer 的 ReturnUrl 是客户端的真实域,以便浏览器在完成同意部分后可以找到返回它的路径。

https://localhost:6001/Account/Login?ReturnUrl=%2Fconnect%2Fauthorize%2Fcallback%3Fclient_id%3Dauthcodeflowclient_dev%26redirect_uri%3Dhttps%253A%252F%252Flocalhost%253A5001%252Fsignin-oidc %26response_type%3Dcode%26prompt%3Dconsent%26scope%3Dopenid%2520profile%2520email%2520offline_...

【讨论】:

好吧,如何为所有域使用单域回调路径?这可能吗? 只有发出初始请求的客户端也必须完成身份验证过程

以上是关于如何在 Identity Server 4 中使用主域进行 Openid 身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Identity Server 4 (JWT) 进行基于角色的 Web API 授权

Identity Server 4 - 如何解决客户端注销后访问令牌仍然有效?

Identity Server 4 Admin 开源项目

Identity Server 4 没有可用于令牌的安全令牌验证器

谁为 Identity Server 4 提供客户端 ID 和客户端密码?

使用 Identity Server 4 和 ASP.NET Identity 添加外部登录