2013-12-14 9 views
27

Io creo un'applicazione web nuova di zecca diciamo "WebApplication1" - WebForms con autenticazione impostata su Account utente individuale. Non aggiungo una singola riga di codice al modello di codice generato automaticamente. Corro l'applicazione e registro un utente "Utente1" ed eseguo l'accesso - funziona perfettamente.Perché gli accessi Identity ASP.NET da un sito vengono condivisi con siti Web diversi sullo stesso computer?

Ora creo un'altra applicazione Web "WebApplication2": stessi WebForm con Autenticazione impostata su Account utente individuale. Di nuovo nessun codice ed eseguo l'applicazione. Ora creo un altro utente dire "Utente2" - funziona bene.

Il problema si verifica quando entrambe le applicazioni sono in esecuzione contemporaneamente. Se accedo al primo sito come "Utente1" questo imposta automaticamente il Context.User.Identity del secondo sito da "webApplication2" come "Utente1" quando non ha nemmeno "Utente1" registrato e viceversa e se io disconnettersi da un sito l'altro viene disconnesso.

Com'è possibile condividere Context.User.Identity?

Il codice è lo stesso -

public static void SignIn(UserManager manager, ApplicationUser user, bool isPersistent){ 

     IAuthenticationManager authenticationManager = HttpContext.Current.GetOwinContext().Authentication; 
     authenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie); 

     var identity = manager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie); 
     authenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity); 
    } 

io certo mi manca un po 'di conoscenza di base su come funziona ASP.Net Identità quindi per favore help me out.

Grazie in anticipo.

+0

Ottima domanda e ottima risposta accettato di seguito. Raccomanderei di rinominare il titolo della domanda in qualcosa di più "question-ish", come "Perché gli accessi Identity ASP.NET da un sito vengono condivisi con siti Web diversi sullo stesso computer?" (O qualcosa del genere ...) – Funka

+0

@ Funka - Domanda cambiata secondo il tuo suggerimento. –

risposta

47

Se il server è configurato per l'utilizzo dell'autenticazione cookie, il server restituirà un cookie al browser contenente attestazioni crittografate e firmate relative all'utente.

Questo cookie è di default denominato: .AspNet.ApplicationCookie.

Questo cookie verrà memorizzato nel browser fino alla sua scadenza (impostazione predefinita 14 giorni e scadenza dello scorrimento) o l'utente che ha escluso esplicitamente l'eliminazione del cookie.

Se si apre un'altra scheda o finestra dello stesso tipo di browser, dopo aver effettuato l'accesso, avrà lo stesso cookie e lo passerà quando si inviano richieste a uno dei due siti Web.

Se entrambi i siti sono configurati per cercare lo stesso nome cookie, lo vedranno entrambi e saranno in grado di decodificare il cookie di autenticazione mentre condividono la stessa macchina e quindi la chiave macchina utilizzata dal server per crittografare/decifrare e firmare il cookie. Non c'è nulla nel cookie che indichi quale sito si trova all'interno dello stesso server a cui appartiene, quindi la rivendicazione "Utente1" che è memorizzata nel tuo sito Web WebApplication1 sarà considerata come autenticata su WebApplication2. Il middleware di autenticazione OWIN non verifica il database se è presente un cookie valido in una richiesta in entrata. Utilizzerà semplicemente le dichiarazioni crittografate presentate (nome utente, eventualmente ruoli e altro) nel cookie.

Se si imposta il CookieName in modo diverso nelle due applicazioni Web, non utilizzerà lo stesso cookie di autenticazione e quindi un utente autenticato in un sito non verrà autenticato dall'altra.

È possibile impostare il cookiename nelle Startup.Auth.cs come questo:

public partial class Startup 
{ 
    // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864 
    public void ConfigureAuth(IAppBuilder app) 
    { 
     // Enable the application to use a cookie to store information for the signed in user 
     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/Account/Login"), 
      CookieName = "MyCookieName", 

     }); 
    } 
} 
+0

Ora ha senso. Grazie! –

Problemi correlati