Non è necessario interrogare direttamente il database per l'attuale ApplicationUser.
Ciò introduce una nuova dipendenza dall'avere un contesto aggiuntivo per i principianti, ma andando avanti le tabelle del database degli utenti cambiano (3 volte negli ultimi 2 anni) ma l'API è coerente. Ad esempio, la users
tabella viene ora chiamata AspNetUsers
in Identity Framework e i nomi di diversi campi chiave primaria continuano a cambiare, quindi il codice in diverse risposte non funzionerà più così com'è .
Un altro problema è che l'accesso OWIN sottostante al database utilizzerà un contesto separato, quindi le modifiche dall'accesso SQL separato possono produrre risultati non validi (ad esempio non vedere le modifiche apportate al database). Ancora una volta la soluzione è lavorare con l'API fornita e non tentare di aggirarla .
Il modo corretto di accedere all'oggetto utente corrente nell'identità ASP.Net (a questa data) è:
var user = UserManager.FindById(User.Identity.GetUserId());
o, se hai un'azione asincrona, qualcosa del tipo:
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
FindById
richiede di disporre della seguente istruzione using in modo che i UserManager
metodi non asincroni siano disponibili (sono metodi di estensione per UserManager, quindi se non si include questo si vedrà solo FindByIdAsync
):
using Microsoft.AspNet.Identity;
Se non si utilizza affatto un controller (ad es. Si utilizza l'iniezione IOC), l'ID utente viene recuperato per intero da:
System.Web.HttpContext.Current.User.Identity.GetUserId();
Se non ti trovi nel controller dell'account standard, dovrai aggiungere quanto segue (come esempio) al controller:
1. Aggiungi queste due proprietà:
/// <summary>
/// Application DB context
/// </summary>
protected ApplicationDbContext ApplicationDbContext { get; set; }
/// <summary>
/// User manager - attached to application DB context
/// </summary>
protected UserManager<ApplicationUser> UserManager { get; set; }
2. Aggiungi questo nel costruttore del controller:
this.ApplicationDbContext = new ApplicationDbContext();
this.UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(this.ApplicationDbContext));
Aggiornamento marzo 2015
Nota: l'aggiornamento più recente al framework Identity modifica una delle classi sottostanti utilizzate per l'autenticazione. Ora puoi accedervi dal contesto Owin dell'attuale HttpContent.
ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());
Addendum:
Quando si utilizza EF e Identity Framework con Azure, tramite una connessione al database remoto (ad esempio test dell'host locale nel database di Azure), è possibile colpire in modo casuale il temuto "errore: 19 - La connessione fisica non è utilizzabile". Poiché la causa viene seppellita all'interno di Identity Framework, dove non è possibile aggiungere nuovi tentativi (o ciò che sembra mancare .Include(x->someTable)
), è necessario implementare un'abitudine SqlAzureExecutionStrategy
nel progetto.