2010-03-24 11 views
5

Introducciónfirma de mensaje no válido cuando se ejecuta proveedor de OpenID en el clúster

Tenemos un proveedor de OpenID, que hemos creado mediante el componente DotNetOpenAuth. Todo funciona bien cuando ejecutamos el proveedor en un solo nodo, pero cuando movemos el proveedor a un clúster de carga equilibrada donde varios servidores manejan solicitudes para cada sesión, obtenemos problemas con la firma del mensaje, ya que el componente DotNetOpenAuth parece estar utilizando algo único desde cada nodo del clúster para crear la firma.

Excepción

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 

Configuración

Tenemos la configuración de la máquina de configuración para utilizar la misma clave de equipo en todos los nodos del clúster y tenemos que configurar una salida de la sesión de proceso con SQL Server.

Pregunta

¿Cómo podemos configurar la clave utilizada por DotNetOpenAuth para firmar sus mensajes para que el cliente va a confiar en las respuestas de todos los servidores de la agrupación durante la misma sesión?

+0

Creo que tenemos el mismo problema: http://stackoverflow.com/questions/2505565/dotnetopenauth-message-signature-was-incorrect –

+0

Tuvimos un problema similar, pero optamos por crear una tienda de nonce que fuera bonita simple y funciona bastante bien en nuestras configuraciones de granja/jardín. Pero el problema que estamos teniendo ahora es con nuestro propio proveedor, que estamos tratando de trasladar a una granja, no al RP. – Garth

Respuesta

3

Debe implementar IProviderApplicationStore y pasar una instancia de este objeto a la OpenIdProvider ejemplo se crea, o establecer el tipo de almacén en su archivo web.config. La implementación de esta interfaz debe proporcionar acceso a una base de datos que todos los servidores de su granja de servidores web comparten.

+0

Por supuesto, parece tan obvio ahora que lo dices, especialmente porque ya hicimos lo mismo para el RP. Gracias. – Garth

+1

Esta interfaz ha sido renombrada a 'IOpenIdApplicationStore' hoy en día. –

1

Al crear su OpenIdRelyingParty, asegúrese de pasar null en el constructor.

Esto coloca su sitio web en el modo sin estado o "tonto" de OpenID. Es un poco más lento para los usuarios iniciar sesión (si lo notan) pero evita tener que escribir un IRelyingPartyApplicationStore para permitir que DotNetOpenAuth funcione en toda la granja;

var openIdRelyingParty = new OpenIdRelyingParty(null); 
+1

Esta no es la parte de retransmisión, sino el proveedor. – Garth

Cuestiones relacionadas