我们正在尝试将使用 DotNetOpenAuth OpenID 版本 3.4.1 的 ASP.NET MVC 应用程序从单个服务器 Web 园移动到硬件负载平衡器后面的物理服务器集群。
我们的旧设置(OpenID RP 工作):
Browser => SHTTP => Server => WebGarden => Nonce/Session Store
我们的新设置(OpenID RP 不工作):
Browser => SHTTP => Load Balancer => HTTP => Cluster Node => WebGarden => Nonce/Session Store DB
当我们使用新设置进行身份验证时,我们被正确地重定向到 OpenID 提供程序,但在经过身份验证后,我们被重定向回我们的集群(中继方)并得到以下异常:
例外
DotNetOpenAuth.Messaging.ProtocolException: Redirects on POST requests that are to untrusted servers is not supported.
at DotNetOpenAuth.Messaging.ErrorUtilities.VerifyProtocol(Boolean condition, String message, Object[] args) in c:\TeamCity\buildAgent\work\bf9e2ca68b75a334\src\DotNetOpenAuth\Messaging\ErrorUtilities.cs:line 235
at DotNetOpenAuth.Messaging.UntrustedWebRequestHandler.GetResponse(HttpWebRequest request, DirectWebRequestOptions options) in c:\TeamCity\buildAgent\work\bf9e2ca68b75a334\src\DotNetOpenAuth\Messaging\UntrustedWebRequestHandler.cs:line 258
at DotNetOpenAuth.OpenId.ChannelElements.OpenIdChannel.GetDirectResponse(HttpWebRequest webRequest) in c:\TeamCity\buildAgent\work\bf9e2ca68b75a334\src\DotNetOpenAuth\OpenId\ChannelElements\OpenIdChannel.cs:line 277
at DotNetOpenAuth.Messaging.Channel.RequestCore(IDirectedProtocolMessage request) in c:\TeamCity\buildAgent\work\bf9e2ca68b75a334\src\DotNetOpenAuth\Messaging\Channel.cs:line 542
at DotNetOpenAuth.Messaging.Channel.Request(IDirectedProtocolMessage requestMessage) in c:\TeamCity\buildAgent\work\bf9e2ca68b75a334\src\DotNetOpenAuth\Messaging\Channel.cs:line 425
at DotNetOpenAuth.Messaging.Channel.Request[TResponse](IDirectedProtocolMessage requestMessage) in c:\TeamCity\buildAgent\work\bf9e2ca68b75a334\src\DotNetOpenAuth\Messaging\Channel.cs:line 405
at DotNetOpenAuth.OpenId.ChannelElements.SigningBindingElement.ProcessIncomingMessage(IProtocolMessage message) in c:\TeamCity\buildAgent\work\bf9e2ca68b75a334\src\DotNetOpenAuth\OpenId\ChannelElements\SigningBindingElement.cs:line 154
at DotNetOpenAuth.Messaging.Channel.ProcessIncomingMessage(IProtocolMessage message) in c:\TeamCity\buildAgent\work\bf9e2ca68b75a334\src\DotNetOpenAuth\Messaging\Channel.cs:line 992
at DotNetOpenAuth.OpenId.ChannelElements.OpenIdChannel.ProcessIncomingMessage(IProtocolMessage message) in c:\TeamCity\buildAgent\work\bf9e2ca68b75a334\src\DotNetOpenAuth\OpenId\ChannelElements\OpenIdChannel.cs:line 172
at DotNetOpenAuth.Messaging.Channel.ReadFromRequest(HttpRequestInfo httpRequest) in c:\TeamCity\buildAgent\work\bf9e2ca68b75a334\src\DotNetOpenAuth\Messaging\Channel.cs:line 386
at DotNetOpenAuth.OpenId.RelyingParty.OpenIdRelyingParty.GetResponse(HttpRequestInfo httpRequestInfo) in c:\TeamCity\buildAgent\work\bf9e2ca68b75a334\src\DotNetOpenAuth\OpenId\RelyingParty\OpenIdRelyingParty.cs:line 501
我们已将涉及的机器添加到受信任的机器列表中,并关闭需要 ssl,但这没有什么区别。我们甚至尝试移除 nonce 存储并使用无状态连接,但这也不起作用。我们总是遇到同样的错误。
我们怀疑这个问题是由于集群节点在连接到 OpenID 提供程序时与负载均衡器的 IP 不同,但我们不确定。
有任何想法吗?
感谢您的回复,让我提供更多信息:
我们内部有 OP 和 RP。我们有多个组织并不真正相互信任,因此我们将提供者分发给每个组织,然后使用属性交换传递用户数据(电子邮件地址、个人编号等),而无需访问彼此直接存储数据(通常是 LDAP)。
令我们困惑的是为什么设置在单台计算机上运行良好(例如,当我们直接连接到集群节点时)而不是当我们通过硬件负载平衡器连接到集群时。
我们已经在两端尝试了各种不同的配置,但到目前为止还没有运气。