2

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

我们的旧体制(OpenID的RP工作):

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

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

浏览器=> SHTTP =>负载均衡=> HTTP =>群集节点=> WebGarden =>随机数/会话存储DB

当我们用新的SE认证TUP我们正确地重定向到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)。

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

我们已经尝试过两端的各种不同的配置,但目前为止没有运气。

回答

4

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

看起来您的RP正在通过使用直接验证(哑模式)检查auth响应来完成OP身份验证,并且OP终端本身正在向您的RP发送HTTP重定向响应。这是不允许的。这个问题是否发生在你的RP尝试登录的每一个OP上,或者仅仅是这个问题?哪一个展示了这个问题?我想跟OP业主谈谈他们在做什么。

+0

看来你的建议在哪里开始寻找帮助了很多。 我们的代码最初基于dotnetopenauth示例,它使用当前的请求url(不是https,但是在集群节点上是http),所以我们在没有https的情况下写出了url,并且loadbalancer发送了大量302响应。最后,我们为所有负载均衡的应用程序添加了一个“强制https”开关,这些应用程序修改了与开放id到https方案有关的所有外出URL。这解决了这个问题。 感谢您的帮助。 – Garth 2010-03-18 20:44:36