Forms Authentication con roles e ticket

di Daniele Bochicchio, in ASP.NET, C#, FormsAuthentication,

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.Identity.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
https://www.aspitalia.com/articoli/aspplus/formauth.aspx

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

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

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi