Domanda

Ho un'app asp.net principale, scritta in asp.net 1.1.Sotto l'applicazione sono in esecuzione diverse app 2.0.Per disconnettersi completamente da un utente posso semplicemente disconnettermi dall'app 1.1 con FormsAuthentication.SignOut o è più complicato di così?

È stato utile?

Soluzione

Quello che stai cercando di fare si chiama Single Sign On e Single Sign Off.Esistono differenze in base alla modalità di configurazione delle applicazioni.Cercherò di chiarire dove entrano in gioco queste differenze.

Per implementare il Single Sign-On e il Single Sign-Off è necessario che il nome del cookie, la protezione e gli attributi del percorso siano gli stessi per tutte le applicazioni.

<authentication mode="Forms">
    <forms name=".cookiename"
           loginUrl="~/Login.aspx" 
           timeout="30" 
           path="/" />
</authentication>

Successivamente devi aggiungere le chiavi della macchina e devono essere le stesse tra tutte le tue applicazioni.

<machineKey validationKey="F9D1A2D3E1D3E2F7B3D9F90FF3965ABDAC304902"
            encryptionKey="F9D1A2D3E1D3E2F7B3D9F90FF3965ABDAC304902F8D923AC"
            validation="SHA1" />

Utilizzi domini di secondo o terzo livello per le applicazioni?Se è così dovrai fare qualcosa in più aggiungendo il dominio al cookie:

protected void Login(string userName, string password)
{
    System.Web.HttpCookie cookie = FormsAuthentication.GetAuthCookie(userName, False);
    cookie.Domain = "domain1.com";
    cookie.Expires = DateTime.Now.AddDays(30);
    Response.AppendCookie(cookie);
}

Ora, per eseguire l'autenticazione singola, la chiamata a FormsAuthentication.SignOut potrebbe non essere sufficiente.La cosa migliore da fare è impostare la scadenza dei cookie su una data passata.Ciò garantirà che il cookie non verrà utilizzato nuovamente per l'autenticazione.

protected void Logout(string userName)
{
    System.Web.HttpCookie cookie = FormsAuthentication.GetAuthCookie(userName, False);
    cookie.Domain = "domain1.com";
    cookie.Expires = DateTime.Now.AddDays(-1);
    Response.AppendCookie(cookie);
}

Sto prendendo in considerazione che stai utilizzando lo stesso database per tutte le applicazioni.Se le applicazioni utilizzano un database separato per la registrazione e l'autenticazione, sarà necessario fare altro.Fammi solo sapere se è questo il caso.Altrimenti questo dovrebbe funzionare per te.

Altri suggerimenti

Potrebbe essere più semplice se disponi di un archivio di sessioni centrale per tutte le tue applicazioni.È quindi possibile impostare la sessione su null in un unico posto.

Questo ha funzionato per me:

Nell'evento Logout, invece del metodo FormsAuthentication.GetAuthCookie utilizza la raccolta Cookies nell'oggetto Request come di seguito:

HttpCookie cookie = Request.Cookies.Get(otherSiteCookieName);
cookie.Expires = DateTime.Now.AddDays(-1);
HttpContext.Current.Response.Cookies.Add(cookie);

Naturalmente, ciò richiede che tu conosca il nome del cookie del sito o dei siti da cui desideri che l'utente venga disconnesso, il che tuttavia non sarà un problema se utilizzi lo stesso cookie in tutte le app Web.

Preferisco usare web.config

<authentication mode="Forms">
    <forms domain=".tv.loc" loginUrl="~/signin" timeout="2880" name="auth" />
</authentication>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top