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
Semplificare il deployment di siti statici con Azure Static Web App
Modificare i metadati nell'head dell'HTML di una Blazor Web App
Generare file per il download da Blazor WebAssembly
Mascherare l'output di un valore all'interno dei log di un workflow di GitHub
Load test di ASP.NET Core con k6
Sfruttare lo stream rendering per le pagine statiche di Blazor 8
Esportare ed analizzare le issue di GitHub con la CLI e GraphQL
Short-circuiting della Pipeline in ASP.NET Core
Sfruttare MQTT in cloud e in edge con Azure Event Grid
Visualizzare le change sul plan di Terraform tramite le GitHub Actions
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
Disabilitare automaticamente un workflow di GitHub (parte 2)