2010-03-24 4 views
5

EinführungUngültige Nachrichtensignatur, wenn sie auf Cluster OpenID-Provider laufen

Wir haben ein OpenID-Provider, die wir mit der DotNetOpenAuth Komponente erstellt. Alles funktioniert gut, wenn wir den Provider auf einem einzigen Knoten ausführen, aber wenn wir den Provider in einen load balanced Cluster verschieben, wo mehrere Server Anfragen für jede Sitzung bearbeiten, bekommen wir das Problem mit der Nachrichtensignierung, da die DotNetOpenAuth-Komponente etwas Einzigartiges zu verwenden scheint von jedem Cluster-Knoten, um die Signatur zu erstellen.

Exception

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 

Setup-

Wir haben die Maschine Config Setup haben die gleiche Maschine Schlüssel auf allen Cluster-Knoten zu verwenden, und wir haben Setup eine Sitzung aus einem Prozess mit SQL Server.

Frage

Wie können wir den Schlüssel, die von DotNetOpenAuth konfigurieren ihre Nachrichten signieren, damit die Client-Antworten von allen Servern im Cluster in der gleichen Sitzung vertrauen?

+0

Ich denke, wir haben das gleiche Problem: http://StackOverflow.com/Questions/2505565/Dotnetopenauth-Message-Signature-Was-incorrect –

+0

Wir hatten ein ähnliches Problem, aber stattdessen entschieden, einen Nonce-Store, der schön war zu erstellen einfach und funktioniert ziemlich gut auf unserem Bauernhof/Garten Setups. Aber das Problem, das wir jetzt haben, ist mit unserem eigenen Provider, den wir versuchen, auf eine Farm zu ziehen, nicht der RP. – Garth

Antwort

3

Sie müssen IProviderApplicationStore implementieren und eine Instanz dieses Objekts an die OpenIdProvider Instanz übergeben Sie erstellen oder den Speichertyp in Ihrer web.config-Datei festgelegt. Ihre Implementierung dieser Schnittstelle muss den Zugriff auf eine Datenbank ermöglichen, die alle Server in Ihrer Webfarm gemeinsam nutzen.

+0

Natürlich scheint es jetzt so offensichtlich zu sein, dass du es sagst, vor allem, weil wir das schon für das RP gemacht haben. Vielen Dank. – Garth

+1

Diese Schnittstelle wurde heute in 'IOpenIdApplicationStore' umbenannt. –

1

Wenn Sie Ihre OpenIdRelyingParty erstellen, vergewissern Sie sich, dass Sie null im Konstruktor übergeben.

Dies versetzt Ihre Website in den statusfreien oder "dummen" Modus der OpenID. Es ist etwas langsamer für Benutzer, um sich anzumelden (wenn Sie es bemerken), aber Sie vermeiden, dass Sie einen IRelyingPartyApplicationStore schreiben müssen, damit DotNetOpenAuth in Ihrer Farm funktionieren kann;

var openIdRelyingParty = new OpenIdRelyingParty(null); 
+1

Dies ist nicht die Relay-Party, sondern der Provider. – Garth

Verwandte Themen