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