Analogamente alle altre funzionalità che abbiamo avuto modo di esplorare in questo speciale, come interazione con i database e social network, ASP.NET Web Pages espone una classe helper estremamente semplice per gestire anche le più comuni necessità relative all'autenticazione.
Tramite la classe WebSecurity, infatti, abbiamo la possibilità di registrare un utente, effettuare la login o verificare se la richiesta provenga da un utente autenticato, semplicemente invocando dei comodi membri statici. Ad esempio, possiamo creare un nuovo account presso il nostro sito sfruttando il metodo CreateUserAndAccount, come in questo esempio:
var username = Request["username"]; if (username.IsEmpty()) { ModelState.AddError("username", "Username obbligatorio"); } // altri controlli qui su password, email, ecc... if (ModelState.IsValid) { var userData = new { Email = "sometest@email.com", Phone = "123456" }; WebSecurity.CreateUserAndAccount(username, password, userData, false); Response.Redirect("/"); }
Come possiamo notare dal codice in alto, dopo aver verificato la correttezza dei dati provenienti dalla request, è sufficiente eseguire il metodo CreateUserAndAccount per popolare il database con i dati del nuovo utente. WebMatrix memorizza queste informazioni all'interno di due tabelle separate, una contenente le sole informazioni di login (username e password), l'altra invece dedicata a mantenere i dati del profilo. I dati che possiamo memorizzare sono assolutamente arbitrari; ad esempio, nel nostro caso, abbiamo valorizzando anche le informazioni Email e Phone tramite un anonymous type. L'unico vincolo, affinché il salvataggio abbia successo, è che nella tabella dei profili esistano delle colonne con il medesimo nome. Per il resto, tutto funziona in maniera pressocché automatica.
WebSecurity, infatti, si occupa di gestire praticamente tutto il lavoro sfruttando internamente un MembershipProvider appositamente pensato per ASP.NET Web Pages e denominato SimpleMembershipProvider (ma se abbiamo necessità particolari, possiamo comunque realizzarne una nostra versione). La sola configurazione da impostare in WebSecurity è il collegamento tra la tabella dei profili e quella degli account. Questa operazione avviene tramite il metodo InitializeDatabaseConnection che possiamo invocare all'interno della pagina speciale _AppStart.cshtml, per essere sicuri che venga eseguito all'avvio dell'applicazione:
@{ WebSecurity.InitializeDatabaseConnection("MyDataBase", "Users", "UserId", "Username", true); }
I parametri che dobbiamo fornire sono, nell'ordine:
- Il nome del database;
- Il nome della tabella degli utenti;
- Il nome della colonna contenente lo User Id;
- Il nome della colonna contenente un identificativo univoco, come lo username o l'indirizzo email, da utilizzare per collegare la tabella utenti a quella degli account;
- L'ultimo parametro, di tipo boolean, indica di creare le tabelle necessarie al membership provider nel caso in cui queste non siano presenti nel database.
Una volta che l'utente sia stato registrato, è possibile effettuare la login tramite l'omonimo metodo:
if (IsPost) { var username = Request["username"]; var password = Request["password"]; if (WebSecurity.Login(username, password)) { Response.Redirect("/SecurePage"); } else { ModelState.AddFormError("Username o password non validi."); } }
Il metodo Logout, invece, permette il sign out dell'utente:
WebSecurity.Logout();
WebSecurity espone inoltre le proprietà IsAuthenticated, utile per verificare se l'utente sia autenticato o meno, e CurrentUserId, tramite la quale possiamo conoscere l'id dell'utente corrente ed eventualmente recuperare ulteriori informazioni sul suo profilo memorizzato nel database.
@{ if (WebSecurity.IsAuthenticated) { var userId = WebSecurity.CurrentUserId; var user = db.QuerySingle("SELECT FirstName FROM Users WHERE UserId = @0", userId); } } @if (WebSecurity.IsAuthenticated) { Benvenuto @user.FirstName <a href="@Href("~/Account/Logout/", string.Empty)">Logout</a> }
Le funzionalità di WebSecurity non si esauriscono certo qui e coprono davvero praticamente tutte le più comuni esigenze in ambito di autenticazione e autorizzazione (inclusa, ad esempio, la gestione dei ruoli). In questo script abbiamo illustrato le feature più basilari, ma chi fosse interessato può consultare la documentazione MSDN a questo indirizzo.
http://aspitalia.com/1u
Riferimenti utili
Il nostro speciale su ASP.NET Razorhttps://www.aspitalia.com/focuson/1253/Speciale-Razor-View-Engine-WebMatrix-ASP.NET-MVC.aspx
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Eseguire query verso tipi non mappati in Entity Framework Core
Eseguire operazioni con timeout in React
Gestire liste di tipi semplici con Entity Framework Core
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Eseguire attività pianificate con Azure Container Jobs
Ottimizzare la latenza in Blazor 8 tramite InteractiveAuto render mode
Ottimizzazione dei block template in Angular 17
Miglioramenti nelle performance di Angular 16
.NET Conference Italia 2023
Utilizzare Model as a Service su Microsoft Azure
Utilizzare i primary constructor in C#
Utilizzare database e servizi con gli add-on di Container App
I più letti di oggi
- Impostare un elemento come ridimensionabile tramite CSS
- Proteggersi dagli attacchi di Open Redirect in ASP.NET Core MVC
- Personalizzare l'errore del rate limiting middleware in ASP.NET Core
- Accedere alla console di una Azure Container App
- Modificare i metadati nell'head dell'HTML di una Blazor Web App
- Gli oggetti CallOut di Expression Blend 4.0
- SQL Server 2005 December CTP
- Sfruttare le nuove tipologie di input di HTML5 con ASP.NET 4.0
- Upload da una pagina web con Dundas Upload