在 ASP.NET Core 2.1 中,为什么 SSO(使用 OpenID 连接)不能与 2 pods 一起工作。然而,它适用于一个 pod

In ASP.NET Core 2.1, why SSO (using OpenID connect) not working with 2 pods. However it works fine with one pod

在对 OpenID Connect 机制(包括 .NET Core 中的身份验证 DLL 会话和 cookie)进行了大量研究之后,在此提出这个问题。希望像您这样的专家能够帮助我解决长期悬而未决的问题。

当我 运行 我的应用程序有多个 pod 时,我无法登录到应用程序并出现以下异常。使用单个 pod,它工作正常。

Exception: The oauth state was missing or invalid. (Unknown location)

Exception: An error was encountered while handling the remote login.

我在 Visual Studio 2017 年使用 ASP.NET Core 2.1,并使用 OpenId Connect 机制实现了 SSO。使用 Ping 作为身份提供者。

应用部署在ICP(IBM Cloud)环境,使用Kubernetes创建pods。

获取异常后,如果我一直打开浏览器不点击,异常变为:

Exception: OAuth Token Endpoint Failure: Status:BadRequestHeader

我尝试了一些操作,例如为应用程序启用 SQL 服务器会话状态(考虑到它是一个分布式会话场景,并且 cud 是会话值在其他 pod 上不可用),启动文件中的 Samesite 配置,实施 ITicket会话存储和其他一些存储,但运气不好。

您是否在每个 pod 中配置了数据保护API?

您由 ASP.NET 核心发布的会话 cookie 已使用数据保护 API

加密

要使来自一个 Pod 的 cookie 可供另一个 Pod 使用,则两个 pods 需要使用相同的密钥进行配置。

用于签署 cookie 的密钥存储在密钥环中。如果您重新部署您的应用程序并且没有正确配置它,那么将为每项服务发布一个新的加密密钥。

如果找不到用于加密 cookie 的密钥,则意味着所有客户端浏览器中的现有会话 cookie 无法再解密。

请参阅此article about this API and this article了解如何配置它。