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
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.