2012-01-13 3 views
6

Vedi aggiornamento in basso della domandaUn'applicazione ASP.NET 4.0 in un sito ASP.NET 2.0 può utilizzare lo stesso cookie di Autenticazione moduli?

Ho un'applicazione web 2.0 ASP.NET (diciamo https://mysite.somedomain.com/), che utilizza l'autenticazione moduli. Desidero integrare un'app Web ASP.NET 4.0 all'interno di questo sito, basata su https://mysite.somedomain.com/NewApp/. Forms Auth sta lavorando sull'app esterna, ma l'app interna sta rifiutando il cookie.

web.config sul esterno (ASP.NET 2.0) web app 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 su quello interno (ASP.NET 4.0) web app 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"/> 

Questo è il codice in Login.aspx.cs che imposta il cookie di autenticazione di successo:

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); 

Se accedo all'applicazione Web esterna, accedi a una pagina all'interno dell'app Web interna, esegue un reindirizzamento alla pagina di accesso e scrive Forms authentication failed for the request. Reason: The ticket supplied was invalid. nel registro eventi sul server.

Come si ottiene il ticket di autenticazione moduli ASP.NET 2.0 da accettare dall'app Web interna di ASP.NET 4.0?

Aggiornamento: Funziona in HTTPS IIS 7.5, ma non in HTTPS IIS 7.0. Facendo qualche altra indagine.

Aggiornamento 2: Abbiamo applicato Server 2008 SP2 al server insieme alla patch recente per il DoS hash-collisione e da allora ha funzionato la condivisione dei cookie.

+0

forse vale la pena di mettere la stessa decrittografia e convalida i valori degli attributi (http://msdn.microsoft.com/en-us/library/w8h3skw9(v=VS. 100) .aspx) nonché i tasti per essere sicuri. Questo è stato un problema tra asp.net 1.1 e 2 – davidsleeps

+0

Ho appena provato questo (e la domanda aggiornata), lo stesso risultato. – geofftnz

risposta

1

Suppongo che tu abbia letto questo - http://msdn.microsoft.com/en-us/library/eb0zx8fc.aspx - forse rimuovi l'attributo ticketCompatibilityMode dall'app 4.0 o almeno assicurati che siano uguali.

+0

colore del collegamento del browser ha detto che avevo, ma andando a leggerlo di nuovo ... – geofftnz

+0

aggiunto domain = "thedomain" all'elemento '', stesso risultato (Messaggio evento: autenticazione Forms non riuscita per la richiesta. Motivo: il biglietto fornito non era valido) – geofftnz

+0

abbiamo che funziona su HTTP su IIS7.5 (l'ambiente di produzione è HTTPS/IIS7.0), lo stiamo semplicemente configurando in HTTPS su 7.5 per eliminarlo. – geofftnz

4

Oltre a mantenere quasi tutti i valori di cui sopra lo stesso, è necessario impostare l'attributo dell'elemento machineKeycompatibilityMode nel file di configurazione dell'applicazione 4.0:

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

GRAZIE PER QUESTO! Ho lottato con questo stesso problema, e questo è ciò che ha risolto per me. –

0

Aggiungere questo appsetting sia web.config file:

add key = "aspnet: UseLegacyFormsAuthenticationTicketCompatibility" value = "true"

0

È necessario assicurarsi che entrambe le applicazioni hanno la stessa chiave di crittografia nella file web.config

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

Forms Authentication Across Applications