Memorizzare informazioni personalizzate sugli account di ASP.NET Identity 2

di Marco De Sanctis, in ASP.NET Identity,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi