2012-01-13 13 views
6

Ver actualización en la parte inferior de la pregunta¿Puede una aplicación ASP.NET 4.0 en un sitio ASP.NET 2.0 usar la misma cookie de autenticación de formularios?

Tengo una aplicación web ASP.NET 2.0 (por ejemplo https://mysite.somedomain.com/), que utiliza la autenticación de formularios. Deseo integrar una aplicación web ASP.NET 4.0 dentro de este sitio, con base en https://mysite.somedomain.com/NewApp/. Forms Auth está trabajando en la aplicación externa, pero la aplicación interna está rechazando la cookie.

web.config en la (ASP.NET 2.0) aplicación web externa contiene:

<httpCookies requireSSL="true"/> 
<authentication mode="Forms"> 
    <forms name="MySiteWebAuth" loginUrl="/Login.aspx" protection="All" 
      path="/" timeout="90" requireSSL="true" slidingExpiration="true"/> 
</authentication> 
<machineKey (same machine key is in both configs) 
    validation="SHA1" 
    decryption="AES"/> 
<authorization> 
    <deny users="?"/> 
    <allow users="*" /> 
</authorization> 

web.config en el interior (ASP.NET 4.0) aplicación web contiene:

<authentication mode="Forms"> 
    <forms name="MySiteWebAuth" loginUrl="/Login.aspx" protection="All" 
      path="/" timeout="90" requireSSL="true" slidingExpiration="true" 
      ticketCompatibilityMode="Framework20"/> 
</authentication> 
<machineKey (same machine key is in both configs) 
    validation="SHA1" 
    decryption="AES"/> 

Este es el código de en Login.aspx.cs que establece la cookie en la autenticación correcta:

FormsAuthenticationTicket ticket = 
    new FormsAuthenticationTicket(
     1, 
     ApplicationContext.User.Identity.Name, 
     DateTime.Now, 
     DateTime.Now.AddMinutes(90), 
     false, 
     ApplicationContext.User.Identity.SessionID.ToString() 
    ); 
HttpCookie cookie = 
    new HttpCookie(
     FormsAuthentication.FormsCookieName, 
     FormsAuthentication.Encrypt(ticket) 
    ); 

cookie.Path = FormsAuthentication.FormsCookiePath; 
cookie.HttpOnly = true; 
Response.Cookies.Add(cookie); 

Si inicio sesión en la aplicación web externa, navego a una página dentro de la aplicación web interna, redirige a la página de inicio de sesión y escribe Forms authentication failed for the request. Reason: The ticket supplied was invalid. en el registro de eventos en el servidor.

¿Cómo consigo que el ticket ASP.NET 2.0 Forms Auth sea aceptado por la aplicación web interna ASP.NET 4.0?

Actualización: funciona bajo HTTPS IIS 7.5, pero no bajo HTTPS IIS 7.0. Haciendo un poco más de investigación.

Actualización 2: Hemos aplicado Server 2008 SP2 al servidor junto con el parche reciente para el hash colisión DoS y desde entonces el intercambio de cookies ha funcionado.

+0

podría valer la pena poner la misma descifrado y validación valores de atributos (http://msdn.microsoft.com/en-us/library/w8h3skw9(v=VS. 100) .aspx) así como también las claves para estar seguro. Este fue un problema entre asp.net 1.1 y 2 – davidsleeps

+0

Acabo de probar eso (y la pregunta actualizada), el mismo resultado. – geofftnz

Respuesta

1

Supongo que has leído esto - http://msdn.microsoft.com/en-us/library/eb0zx8fc.aspx - quizás elimines el atributo ticketCompatibilityMode de tu aplicación 4.0, o al menos asegúrate de que sea el mismo.

+0

color del enlace del navegador dijo que lo había hecho, pero voy a leerlo de nuevo ... – geofftnz

+0

dominio agregado = "thedomain" al elemento '', mismo resultado (Mensaje de evento: autenticación de formularios fallida para la solicitud. Motivo: El ticket proporcionado fue inválido) – geofftnz

+0

lo tenemos trabajando en HTTP en IIS7.5 (el entorno de producción es HTTPS/IIS7.0), solo lo estamos configurando en HTTPS en 7.5 para eliminarlo. – geofftnz

4

Además de mantener casi la totalidad de los valores antes mencionados de la misma, que necesita para establecer compatibilityMode atributo del elemento machineKey en el archivo de configuración de la aplicación 4.0:

<machineKey compatibilityMode="Framework20SP2" validationKey="THE_KEY" decryptionKey="ANOTHER_KEY" validation="SHA1" /> 
+0

¡GRACIAS POR ESTO! He estado luchando con este mismo problema, y ​​esto es lo que me solucionó. –

0

Añadir esta appSetting tanto web.config archivos:

add key = "Red PEA: UseLegacyFormsAuthenticationTicketCompatibility" value = "true"

0

Es necesario asegurarse de que ambas aplicaciones tienen la misma clave de cifrado en el archivos web.config

<machineKey 
     validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE" 
     decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F" 
     validation="SHA1" /> 

Forms Authentication Across Applications

Cuestiones relacionadas