【问题标题】:DotNetOpenAuth RelayParty not working on load balanced clusterDotNetOpenAuth RelayParty 在负载平衡集群上不起作用
【发布时间】:2010-03-17 12:39:10
【问题描述】:

我们正在尝试将使用 DotNetOpenAuth OpenID 版本 3.4.1 的 ASP.NET MVC 应用程序从单个服务器 Web 园移动到硬件负载平衡器后面的物理服务器集群。

我们的旧设置(OpenID RP 工作):

浏览器 => SHTTP => 服务器 => WebGarden => 随机数/会话存储

我们的新设置(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)。

让我们感到困惑的是为什么设置在单台计算机上运行良好(例如,当我们直接连接到集群节点时)而不是当我们通过硬件负载平衡器连接到集群时。

我们已经在两端尝试了各种不同的配置,但到目前为止都没有成功。

【问题讨论】:

    标签: openid load-balancing dotnetopenauth cluster-computing web-garden


    【解决方案1】:

    对“不受信任的服务器”的引用可能有点误导。它与 web.config 文件中的白名单/黑名单无关,尽管这是一个很好的猜测。在这种情况下,一切都是不受信任的服务器,因为 OpenID 使用 UntrustedWebRequestHandler 来保护您的站点免受 OpenID 可能会暴露您的站点的无数攻击。

    看起来您的 RP 正在通过使用直接验证(哑模式)检查身份验证响应来完成对 OP 的身份验证,并且 OP 端点本身正在向您的 RP 发送 HTTP 重定向响应。这是不允许的。对于您的 RP 尝试登录的每个 OP 或仅此一个,是否会出现此问题?哪一个(或多个)表现出这个问题?我想和 OP 所有者谈谈他们在做什么。

    【讨论】:

    • 您关于从哪里开始寻找的建议似乎很有帮助。我们的代码最初基于 dotnetopenauth 示例,它使用当前请求 url(不是 https,而是集群节点上的 http),所以我们写出没有 https 的 url,负载均衡器发送了大量 302 响应。最后,我们为所有负载平衡的应用程序添加了一个“强制 https”开关,它修改了与打开 id 相关的所有传出 url 到 https 方案。这解决了问题。感谢您的帮助。
    猜你喜欢
    • 2017-02-23
    • 2017-06-19
    • 2012-04-16
    • 2023-03-14
    • 2015-08-07
    • 2012-12-19
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    相关资源
    最近更新 更多