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
Usare lo spread operator con i collection initializer in C#
Load test di ASP.NET Core con k6
Implementare il throttling in ASP.NET Core
Utilizzare l'operatore GroupBy come ultima istruzione di una query LINQ in Entity Framework
Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
Come migrare da una form non tipizzata a una form tipizzata in Angular
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
Controllare gli accessi IP alle app con Azure Container Apps
Registrare servizi multipli tramite chiavi in ASP.NET Core 8
Migrare una service connection a workload identity federation in Azure DevOps
Effettuare il binding di date in Blazor
I più letti di oggi
- C# 4
- Spaziatura tra i caratteri in Silverlight 5
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Segui in tempo reale il TechEd 2004
- da oggi è possibile fare login velocemente con LinkedIn e Google. a questi si aggiunge il supporto già attivo per Facebook, Twitter, Microsoft Account, Windows Hello e OpenID, per darvi sempre più possibilità di accedere semplicemente alla nostra community! #aspitalia
- Migrare una service connection a workload identity federation in Azure DevOps
- Evitare postback multipli in un UpdatePanel