2012-05-28 43 views
8

He estado usando WIF para autenticar nuestro nuevo sitio web, el STS se basa en la implementación de los iniciadores.WIF-ID1014: la firma no es válida. Los datos pueden haber sido manipulados con

Para permitir que esto funcione correctamente en un entorno de carga equilibrada he utilizado lo siguiente en el archivo global.asax para anular el comportamiento del certificado predeterminado.

void onServiceConfigurationCreated(object sender, ServiceConfigurationCreatedEventArgs e) 
     { 
      List<CookieTransform> sessionTransforms = new List<CookieTransform>(new CookieTransform[] 
      { 
       new DeflateCookieTransform(), 
       new RsaEncryptionCookieTransform(e.ServiceConfiguration.ServiceCertificate), 
       new RsaSignatureCookieTransform(e.ServiceConfiguration.ServiceCertificate) 
      }); 

      SessionSecurityTokenHandler sessionHandler = new SessionSecurityTokenHandler(sessionTransforms.AsReadOnly()); 
      e.ServiceConfiguration.SecurityTokenHandlers.AddOrReplace(sessionHandler); 
     } 

Esto es todo de trabajo justas y encontrar personas han sido con éxito utilizando el sistema, sin embargo, de vez en cuando tenemos una ráfaga de:

ID1014: La firma no es válida. Los datos pueden haber sido manipulados.

en los registros de eventos, así que encendí el seguimiento de WIF y vi lo siguiente mencionado en el registro.

ID1074: Se produjo una excepción CryptographicException al intentar encriptar la cookie utilizando la API ProtectedData (vea la excepción interna para más detalles). Si está utilizando IIS 7.5, esto podría deberse a que la configuración loadUserProfile del conjunto de aplicaciones está configurada en falso.

Tengo la sensación de que esto me está llevando por un callejón oscuro porque pensé que debido a que había cambiado la implementación para usar RSA, esto no debería afectarme.

¿Alguna idea para ayudarme?

+0

Gracias por la respuesta, duplicó todo eso y está funcionando bien, puede ver los puntos de interrupción atrapados y también se está generando el seguimiento. Tengo FederatedAuthentication.ServiceConfigurationCreated + = onServiceConfigurationCreated; En el inicio de la aplicación. – RubbleFord

Respuesta

2

Cambié la implementación para modificar el tiempo de espera en el método ontokencreated. Esto evita la reedición.

protected override void OnSessionSecurityTokenCreated(Microsoft.IdentityModel.Web.SessionSecurityTokenCreatedEventArgs args) 
     { 
      args.SessionToken = FederatedAuthentication.SessionAuthenticationModule.CreateSessionSecurityToken(
       args.SessionToken.ClaimsPrincipal, 
       args.SessionToken.Context, 
       DateTime.UtcNow, 
       DateTime.UtcNow.AddDays(365), 
       true 
       ); 
      //base.OnSessionSecurityTokenCreated(args); 
     } 
+0

¿Qué hace esta anulación exactamente en términos de la excepción que recibía? – ABC

+0

Lo siento, no puedo recordar, tendría que echarle un vistazo a la base de código. – RubbleFord

+0

Gracias, si tienes la oportunidad, ¿podrías avisarme? – ABC

0

¿Intentó establecer la opción loadUserProfile en verdadero? ¿El problema todavía ocurre?

(Seleccione el grupo de aplicaciones en IIS y luego haga clic en "Configuración avanzada" a la derecha. "Cargar perfil de usuario" se encuentra en la sección "Modelo de proceso").

+0

No hemos probado esto simplemente porque estamos usando RSA, no DPAPI. – RubbleFord

3

Las cookies del navegador están encriptadas con el mecanismo "antiguo" - DPAPI. Por lo tanto, cuando el servidor intenta descifrar las cookies, falla: su código usa RSA ahora, no DPAPI.

Como solución temporal, borre la caché del navegador y la aplicación comenzará a funcionar como se espera.

+0

Nunca hemos usado el otro sistema ya que estamos en un entorno con equilibrio de carga. – RubbleFord

0

La aparición intermitente de su error, combinada con la excepción DPAPI que aparece en sus trazas, me sugiere que en realidad no está anulando la transformación de cookies, y su servicio todavía está utilizando DPAPI.

Esto podría ser una posibilidad remota, pero en su fragmento de código noté que su método reemplaza "onServiceConfigurationCreated" comienza con una minúscula o. Tal tipo de error, de hecho, le impediría anular correctamente el comportamiento predeterminado de WIF.

Cuestiones relacionadas