2010-03-24 7 views
5

Introduzionefirma del messaggio non valido quando si esegue provider OpenID su Cluster

Abbiamo un fornitore OpenID, che abbiamo creato utilizzando il componente DotNetOpenAuth. Tutto funziona alla perfezione quando eseguiamo il provider su un singolo nodo, ma quando spostiamo il provider in un cluster con bilanciamento del carico in cui più server gestiscono le richieste per ogni sessione, si verifica un problema con la firma del messaggio poiché il componente DotNetOpenAuth sembra utilizzare qualcosa di unico da ciascun nodo del cluster per creare la firma.

Eccezione

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

Abbiamo il setup della macchina config per utilizzare la stessa chiave macchina su tutti i nodi cluster e abbiamo impostato un fuori sessione di processo con SQL Server.

Domanda

Come facciamo a configurare la chiave usata da DotNetOpenAuth per firmare i propri messaggi in modo che il cliente si fidi risposte da tutti i server del cluster durante la stessa sessione?

+0

Penso che abbiamo lo stesso problema: http://stackoverflow.com/questions/2505565/dotnetopenauth-message-signature-was- incorrect –

+0

Abbiamo avuto un problema simile, ma invece abbiamo optato per creare un nonce store che era carino semplice e funziona piuttosto bene nelle nostre configurazioni fattoria/giardino. Ma il problema che stiamo avendo ora è con il nostro provider, che stiamo cercando di spostare in una fattoria, non nell'RP. – Garth

risposta

3

È necessario implementare IProviderApplicationStore e passare un'istanza di questo oggetto per l'istanza OpenIdProvider si crea, o impostare il tipo di archivio nel file web.config. L'implementazione di questa interfaccia deve fornire l'accesso a un database condiviso da tutti i server della tua Web farm.

+0

Ovviamente sembra così ovvio ora che lo dici, soprattutto perché abbiamo già fatto la stessa cosa per l'RP. Grazie. – Garth

+1

Questa interfaccia è stata rinominata in "IOpenIdApplicationStore' al giorno d'oggi. –

1

Quando si crea il tuo OpenIdRelyingParty assicurati di passare null nel costruttore.

Questo pone il tuo sito web in OpenID stateless o in modalità 'stupida'. È leggermente più lento per gli utenti effettuare l'accesso (se lo si nota), ma si evita di dover scrivere un IRelyingPartyApplicationStore per consentire a DotNetOpenAuth di funzionare in tutta la farm;

var openIdRelyingParty = new OpenIdRelyingParty(null); 
+1

Questa non è la parte relay, ma il provider. – Garth