Uno dei maggiori pregi di ASP.NET Identity 2 è la possibilità di personalizzarne praticamente ogni aspetto, sia per quanto riguarda le policy di sicurezza (abbiamo visto un paio di esempi negli ultimi script), sia sugli aspetti di storage e di memorizzazione dei dati di profilo.
A differenza di quanto avveniva con il vecchio MembershipProvider, in cui eravamo costretti a usare la classe MembershipUser, in ASP.NET Identity possiamo utilizzare un qualsiasi oggetto per rappresentare il nostro utente, purché implementi l'interfaccia IUser
public interface IUser<out TKey> { TKey Id { get; } string UserName { get; set; } }
Nella maggior parte dei casi, però, conviene ereditare dalla classe IdentityUser, che espone già una serie di proprietà basilari, come la lista dei claim e dei ruoli dell'utente. Se creiamo un nuovo progetto ASP.NET MVC da Visual Studio, possiamo notare che questo è proprio l'approccio utilizzato per definire la classe ApplicationUser.
public class ApplicationUser : IdentityUser { ... }
Questo è il posto dove possiamo aggiungere dati personalizzati di profilo. Per esempio, immaginiamo di dover tener traccia della data di nascita dell'utente. Ci è sufficiente aggiungere la corrispondente proprietà a questa classe e il gioco è fatto:
public class ApplicationUser : IdentityUser { public DateTime? BirthDate { get; set; } }
Visto che lo strato di persistenza è gestito da Entity Framework Code First, la nostra modifica è immediatamente funzionante e ci basterà valorizzare questa proprietà per memorizzarla sul database.
Se vogliamo recuperare l'utente corrente per conoscere quale sia la sua data di nascita, dobbiamo avvalerci dello UserManager:
// using necessaria per GetUserManager using Microsoft.AspNet.Identity.Owin; public class HomeController : Controller { public async Task<ActionResult> Index() { if (this.User.Identity.IsAuthenticated) { var userManager = HttpContext.GetOwinContex() .GetUserManager<ApplicationUserManager>(); var user = await userManager .FindByNameAsync(this.User.Identity.Name); var birthDate = user.BirthDate; } return View(); } }
Nella action precedente, abbiamo istanziato l'ApplicationUserManager dal contesto Owin, tramite il metodo GetUserManager (attenzione a includere il namespace indicato in alto). Successivamente è sufficiente invocare FindByNameAsync per recuperare lo user, per esempio tramite il suo nome, e accedere alla proprietà che abbiamo definito.
Per memorizzarla, invece, abbiamo a disposizione il metodo UpdateAsync:
var user = await userManager.FindByNameAsync(this.User.Identity.Name); user.BirthDate = new DateTime(1977, 7, 10); await userManager.UpdateAsync(user);
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Load test di ASP.NET Core con k6
Eseguire query manipolando liste di tipi semplici con Entity Framework Core
Sfruttare i KeyedService in un'applicazione Blazor in .NET 8
Utilizzare Tailwind CSS all'interno di React: primi componenti
Autenticarsi in modo sicuro su Azure tramite GitHub Actions
Trasformare qualsiasi backend in un servizio GraphQL con Azure API Management
Specificare il versioning nel path degli URL in ASP.NET Web API
Evitare il flickering dei componenti nel prerender di Blazor 8
Utilizzare HiLo per ottimizzare le insert in un database con Entity Framework
C# 12: Cosa c'è di nuovo e interessante
Eseguire una query su SQL Azure tramite un workflow di GitHub
Sfruttare al massimo i topic space di Event Grid MQTT