Come ottenere l’utente corrente e come utilizzare la class utente in MVC5?

  • Come posso ottenere l’ID dell’utente attualmente connesso in MVC 5 ? Ho provato i suggerimenti di StackOverflow, ma sembra che non siano per MVC 5.
  • Inoltre, qual è la best practice di MVC 5 per l’assegnazione di materiale agli utenti? (ad es. un User dovrebbe avere Items . Devo memorizzare l’ Id dell’utente in Item ? Posso estendere la class User con una proprietà di navigazione List ?

Sto usando “Account utente individuale” dal modello MVC.

Ho provato questi:

  • Come posso ottenere l’utente corrente in un’applicazione MVC?
  • Come ottenere l’utente corrente in ASP.NET MVC
  • Ottieni l’id utente connesso – questo genera quanto segue:

‘Membership.GetUser ()’ è null.

Se si sta codificando in un controller MVC ASP.NET, utilizzare

 using Microsoft.AspNet.Identity; ... User.Identity.GetUserId(); 

Vale la pena ricordare che User.Identity.IsAuthenticated e User.Identity.Name funzioneranno senza aggiungere la suddetta istruzione using . Ma GetUserId() non sarà presente senza di esso.

Se sei in una class diversa da un controller, usa

 HttpContext.Current.User.Identity.GetUserId(); 

Nel modello predefinito di MVC 5, l’ID utente è un GUID memorizzato come stringa.

Nessuna best practice ancora, ma ho trovato alcune preziose informazioni sull’estensione del profilo utente:

Prova qualcosa come:

 var store = new UserStore(new ApplicationDbContext()); var userManager = new UserManager(store); ApplicationUser user = userManager.FindByNameAsync(User.Identity.Name).Result; 

Funziona con RTM.

Se si desidera l’object ApplicationUser in una riga di codice (se è installata l’id quadro ASP.NET più recente), provare:

 ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId()); 

Avrai bisogno delle seguenti istruzioni usando:

 using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.Owin; 

Ottenere l’Id è abbastanza semplice e l’hai risolto.

La tua seconda domanda però è un po ‘più coinvolta.

Quindi, questo è tutto roba prerelease in questo momento, ma il problema comune che stai affrontando è dove stai estendendo l’utente con nuove proprietà (o una raccolta di elementi in te è una domanda).

Subito dopo avrai un file chiamato IdentityModel nella cartella Models (al momento della scrittura). Lì hai un paio di classi; ApplicationUser e ApplicationDbContext . Per aggiungere la tua collezione di Items , ti consigliamo di modificare la class ApplicationUser , proprio come faresti se si trattasse di una class normale che stavi utilizzando con Entity Framework. Infatti, se guardi rapidamente sotto il cofano scoprirai che tutte le classi relative all’id quadro (Utente, Ruolo ecc.) Sono solo POCO con le annotazioni di dati appropriate, quindi giocano con EF6.

Successivamente, dovrai apportare alcune modifiche al costruttore di AccountController modo che sappia utilizzare DbContext.

 public AccountController() { IdentityManager = new AuthenticationIdentityManager( new IdentityStore(new ApplicationDbContext())); } 

Ora ottenere l’intero object utente per l’utente che ha effettuato l’accesso è un po ‘esoterico per essere onesto.

  var userWithItems = (ApplicationUser)await IdentityManager.Store.Users .FindAsync(User.Identity.GetUserId(), CancellationToken.None); 

Questa linea userWithItems.Items il lavoro e sarete in grado di accedere a userWithItems.Items come volete.

HTH

Sento il tuo dolore, sto cercando di fare la stessa cosa. Nel mio caso voglio solo cancellare l’utente.

Ho creato una class controller di base da cui ereditano tutti i controller. In esso sovrascrivo OnAuthentication e imposta filterContext.HttpContext.User to null

È il meglio che sono riuscito a fare …

 public abstract class ApplicationController : Controller { ... protected override void OnAuthentication(AuthenticationContext filterContext) { base.OnAuthentication(filterContext); if ( ... ) { // You may find that modifying the // filterContext.HttpContext.User // here works as desired. // In my case I just set it to null filterContext.HttpContext.User = null; } } ... }