#614 - Forms Authentication con roles e ticket

La Forms Authentication di ASP.NET non supporta in maniera proprio semplice l'assegnazione, in fase di login, dei ruoli (roles) associati all'utente.
In genere queste informazioni sono salvate in cookie o variabili session, ma è possibile aggiungerle facilmente, attraverso l'uso di un Authentication Ticket, allo stesso cookie di autenticazione.
Dovremo definire una funziona Authenticate, da invocare una volta che il login è andato a buon fine, come la seguente:

public void Authenticate (string Username) {
  // preparo l'autenticazione

  FormsAuthentication.Initialize();
  string roles = GetRoles(Username);

    // genero il ticket

  FormsAuthenticationTicket fat = new FormsAuthenticationTicket(1,
                                  Username, DateTime.Now,
                                  DateTime.Now.AddMinutes(20), // 20 minuti

                                  false, roles, FormsAuthentication.FormsCookiePath);

  // creo il cookie di autenticazione

  HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(fat));
  Response.Cookies.Add(cookie);

  // Return URL dopo autenticazione

  if (Request["ReturnUrl"] == null)
    Response.Redirect("/");

  Response.Redirect(Request["ReturnUrl"]);
}

private string GetRoles(string Username) {
  // estrazione dei roles dal database, separati da ;

  return "admins;users";
}

La funzione GetRoles servirà per caricare da database i roles associati all'utente, separati da ;.
Infine dovremo intercettare l'evento Application_AuthenticateRequest dell'applicazione ASP.NET attraverso il global.asax o, meglio ancora, un HttpModule:

// l'utente cerca di autenticarsi

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
  if (!HttpContext.Current.User.IsAuthenticated)
    return;

  // carico l'utente e recupero il ticket

  FormsIdentity identity = (FormsIdentity) HttpContext.Current.User.Identity;
  FormsAuthenticationTicket ticket = identity.Ticket;

  // carico i roles dal ticket del cookie

  String[] roles = ticket.UserData.Split(';');

  // sovrascrivo User con un nuovo GenericPrincipal

  HttpContext.Current.User = new GenericPrincipal(identity, roles);
  }
}

Nella funzione non faremo altro che caricare dal ticket i roles e sovrascrivere l'User corrente con un nuovo GenericPrincipal.

Per approfondimenti sulla Forms Authentication, si veda:

Autenticazione di ASP.NET: Forms Authentication
http://www.aspitalia.com/articoli/aspplus/formauth.aspx

Autenticazione di ASP.NET: Forms Authentication con roles
http://www.aspitalia.com/articoli/aspplus/formauthroles.aspx

Forms Authentication: un'applicazione multi login
http://www.aspitalia.com/articoli/aspplus/multilogin.aspx


Approfondimenti

Commenti

Esprimi il tuo giudizio su questo script:

Per procedere devi essere autenticato.

mobydik65 scrive:
#614 - Forms Authentication con roles e ticket

Ciao,Sto tentando di utilizzare questo sistema di autenticazione, o meglio quello che hai proposto nel numero 94 del giugno 2005 su INTERNET MAGAZINE...
martedì 6 dicembre 2005 | 5 risposte
torin.it scrive:
#614 - Forms Authentication con roles e ticket

Ciao a tutti.Ho un po' di problemi a capire come funziona l'autenticazione form con ticket. Intanto spiego quello che mi servirebbe ottenere. Ho un ...
mercoledì 16 marzo 2005 | 1 risposta
daniele.pala scrive:
#614 - Forms Authentication con roles e ticket

Ho provato il codice ma il metodo SetAuthCookie mi azzera il campo UserData dal cookie che quindi non mi ritrovo più nel global.asax.Uso Vb.net ma ...
mercoledì 16 giugno 2004 | 3 risposte

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.




IN EVIDENZA
MISC