2010-03-24 88 views
5

介紹消息無效簽名的集羣

運行OpenID提供商時,我們有我們使用DotNetOpenAuth組件創建OpenID提供者。當我們在單個節點上運行提供程序時,一切都很順利,但是當我們將提供程序移動到負載均衡的集羣,其中多個服務器正在處理每個會話的請求時,由於DotNetOpenAuth組件似乎使用的是獨特的從每個集羣節點創建簽名。

異常

DotNetOpenAuth.Messaging.Bindings.InvalidSignatureException: Message signature was incorrect. 
    at DotNetOpenAuth.OpenId.ChannelElements.SigningBindingElement.ProcessIncomingMessage(IProtocolMessage message) in c:\BuildAgent\work\7ab20c0d948e028f\src\DotNetOpenAuth\OpenId\ChannelElements\SigningBindingElement.cs:line 139 
    at DotNetOpenAuth.Messaging.Channel.ProcessIncomingMessage(IProtocolMessage message) in c:\BuildAgent\work\7ab20c0d948e028f\src\DotNetOpenAuth\Messaging\Channel.cs:line 940 
    at DotNetOpenAuth.OpenId.ChannelElements.OpenIdChannel.ProcessIncomingMessage(IProtocolMessage message) in c:\BuildAgent\work\7ab20c0d948e028f\src\DotNetOpenAuth\OpenId\ChannelElements\OpenIdChannel.cs:line 172 
    at DotNetOpenAuth.Messaging.Channel.ReadFromRequest(HttpRequestInfo httpRequest) in c:\BuildAgent\work\7ab20c0d948e028f\src\DotNetOpenAuth\Messaging\Channel.cs:line 378 
    at DotNetOpenAuth.OpenId.RelyingParty.OpenIdRelyingParty.GetResponse(HttpRequestInfo httpRequestInfo) in c:\BuildAgent\work\7ab20c0d948e028f\src\DotNetOpenAuth\OpenId\RelyingParty\OpenIdRelyingParty.cs:line 493 

設置

我們有機器的配置設置爲使用所有羣集節點上的同一臺機器的關鍵,我們必須建立一個進程外會話與SQL Server。

問題

我們如何配置使用DotNetOpenAuth簽署的消息,因此客戶端將在同一會話期間信任來自集羣中的所有服務器的響應的關鍵?

+0

我認爲我們有同樣的問題:http://stackoverflow.com/questions/2505565/dotnetopenauth-message-signature-was-incorrect – 2010-03-24 18:47:40

+0

我們有一個類似的問題,而是選擇創建一個nonce商店,這非常漂亮簡單並且在我們的農場/花園設置上運行得非常好。但我們現在面臨的問題是我們自己的提供商,我們正試圖遷移到農場,而不是RP。 – Garth 2010-03-25 07:13:55

回答

3

您必須實現IProviderApplicationStore,並通過這個對象的實例來創建OpenIdProvider實例,或設置在你的web.config文件存儲類型。此接口的實施必須提供對Web場中所有服務器共享的數據庫的訪問權限。

+0

當然,現在看起來很明顯,特別是因爲我們已經爲RP做了同樣的事情。謝謝。 – Garth 2010-03-26 08:14:30

+1

現在這個界面已經被重命名爲'IOpenIdApplicationStore'。 – 2012-09-16 21:26:09

1

當您創建OpenIdRelyingParty時,請確保您在構造函數中傳遞null。

這會使您的網站進入OpenID無狀態或「啞」模式。用戶登錄的速度稍微慢一些(如果你注意到的話),但是你不必編寫IRelyingPartyApplicationStore來允許DotNetOpenAuth在你的場中工作;

var openIdRelyingParty = new OpenIdRelyingParty(null); 
+1

這不是中繼方,而是提供者。 – Garth 2010-03-24 19:37:46