Come ottenere l'utente corrente e come utilizzare la classe utente in MVC5?


159
  • Come posso ottenere l'ID dell'utente attualmente connesso in MVC 5 ? Ho provato i suggerimenti StackOverflow, ma sembrano non essere per MVC 5.
  • Inoltre, qual è la best practice MVC 5 per assegnare elementi agli utenti? (ad esempio, una Userdovrebbe avere Items. devo conservare per l'utente Idin Item? Posso estendere la Userclasse con una List<Item>proprietà di navigazione?

Sto utilizzando "Account utente individuali" dal modello MVC.

Ho provato questi:

'Membership.GetUser ()' è null.


Aggiunti i riferimenti di quello che ho provato. L'ultimo era OK in MVC4 ma non in MVC5. Inoltre ho bisogno di alcune migliori pratiche di "utilizzo dell'utente" :)
Adam Szabo,

Quando dici che stai usando MVC 5, cosa stai usando per diventare membro? OWin.Security?
Aron,

"Account utente individuali" dal modello MVC.
Adam Szabo,

3
HttpContext.Current.User.Identity.Nameè il nome dell'utente attualmente registrato.
Wiktor Zychla,

1
Come ottenere l' ID ? Vorrei assegnare l'utente corrente a quello Itemche crea, ma non in base al nome utente (che potrebbe cambiare). Non funziona nel modo in cui "HttpContext.Current" System.Web.HttpContextBase "non contiene una definizione per" Current "e nessun metodo di estensione" Current "accetta un primo argomento di tipo" System.Web.HttpContextBase "( ti manca una direttiva using o un riferimento di assembly?) `. Sei sicuro che la tua soluzione sia per MVC 5?
Adam Szabo,

Risposte:


313

Se stai codificando un controller MVC ASP.NET, usa

using Microsoft.AspNet.Identity;

...

User.Identity.GetUserId();

Vale la pena menzionarlo User.Identity.IsAuthenticatede User.Identity.Namefunzionerà senza aggiungere la usingdichiarazione di cui sopra . Ma GetUserId()non sarà presente senza di essa.

Se sei in una classe 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 informazioni preziose sull'estensione del profilo utente:


9
L'autenticazione e l'autorizzazione dell'utente sono cambiate per ASP.NET MVC 5. Ora si tratta di un'autenticazione basata su attestazioni con interfacce e repository generici che è possibile utilizzare con EF o altri provider (l'implementazione EF viene fornita come impostazione predefinita). Poiché GetUserIdè un metodo di estensione memorizzato nella parte inferiore di Ass_Start\IdentityConfig.cs, ovunque sia necessario utilizzarlo, se su uno spazio dei nomi diverso, è necessario impostare using Microsoft.AspNet.Identityl'estensione affinché diventi visibile.
Anderson Matos

1
survey.UserId = Guid.Parse (User.Identity.GetUserId ());
NicoJuicy,

Se aggiungo il riferimento usando l'utente è ancora sottolineato in rosso? Perché dovrebbe essere?
Zapnologica,

@Zapnologica: prova a ricostruire il progetto, forse VS IntelliSense è un po 'lento.
Adam Szabo,

5
NOTA utente è disponibile solo in un controllore msdn.microsoft.com/en-us/library/... (@Zapnologica stai usando al di fuori di un controller provare HttpContext.Current.User.Identity.GetUserId ();?)
Adween

28

Prova qualcosa del tipo:

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

Funziona con RTM.


11
Impone un viaggio del database non necessario.
Arash,

3
@Arash, come si suppone che l'applicazione ottenga l'oggetto dell'utente senza contattare il database?
fabspro

2
@Arash non importa, capisco cosa intendi. L'ID può essere recuperato con User.Identity.GetUserId (); senza alcun viaggio nel database.
fabspro

Ricorda con mvc5 (appartenenza 2): User.Identity.GetUserId () è diverso con l'id nella tabella [AspNetUsers]. Quindi Jakub Arnold e Rok sono nel modo giusto
Grey Wolf,

Sono un po 'confuso con la risposta. Sto ottenendo un tipo UserStore non sembra esistere nel mio contesto di controller. Qualche idea?
Jhourlad Estrella,

19

Se si desidera l'oggetto ApplicationUser in una riga di codice (se è installata l'ultima identità ASP.NET), provare:

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

Avrai bisogno delle seguenti istruzioni using:

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

Oggetto non trovato per <ApplicationUserManager>
Fandango68

7

Ottenere l'ID è piuttosto semplice e tu l'hai risolto.

La tua seconda domanda è un po 'più coinvolta.

Quindi, questo è tutto roba pre-release in questo momento, ma il problema comune che stai affrontando è dove stai estendendo l'utente con nuove proprietà (o una raccolta di articoli nella tua domanda).

Immediatamente otterrai un file chiamato IdentityModelnella cartella Modelli (al momento della scrittura). Lì dentro hai un paio di lezioni; ApplicationUsere ApplicationDbContext. Per aggiungere la tua raccolta Items, ti consigliamo di modificare la ApplicationUserclasse, proprio come faresti se fosse una classe normale che stavi utilizzando con Entity Framework. In effetti, se dai una rapida occhiata, scoprirai che tutte le classi relative all'identità (Utente, Ruolo, ecc.) Sono solo POCO ora con le annotazioni dei dati appropriate, quindi funzionano bene con EF6.

Successivamente, dovrai apportare alcune modifiche al AccountControllercostruttore in modo che sappia usare DbContext.

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

Ora ottenere l'intero oggetto utente per l'utente che ha effettuato l'accesso è un po 'esoterico per essere onesti.

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

Quella linea farà il lavoro e sarai in grado di accedere userWithItems.Itemscome desideri.

HTH


Suppongo che non ci sia qualcosa di simile ai documenti pre-release per tutto ciò che c'è?
Derek Tomes il

@Derek Tomes - Non che mi sia imbattuto. Credo che dovremo aspettare fino al 13 novembre per veri documenti. Non è stato bello essere sinceri, c'è persino una richiesta di migliore guida su uservoice - aspnet.uservoice.com/forums/41199-general-asp-net/suggestions/…
EightyOne Unite

ok ma come arrivo a un'istanza di tipo AccountController?
nido

0

Sento il tuo dolore, sto provando a fare la stessa cosa. Nel mio caso voglio solo cancellare l'utente.

Ho creato una classe di controller di base da cui ereditano tutti i miei controller. In esso ho la precedenza OnAuthenticatione impostare ilfilterContext.HttpContext.User to null

Questo è il migliore che sono riuscito a lontano ...

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;
        }
    }
    ...
}

0
        string userName="";
        string userId = "";
        int uid = 0;
        if (HttpContext.Current != null && HttpContext.Current.User != null
                  && HttpContext.Current.User.Identity.Name != null)
        {
            userName = HttpContext.Current.User.Identity.Name;              
        }
        using (DevEntities context = new DevEntities())
        {

              uid = context.Users.Where(x => x.UserName == userName).Select(x=>x.Id).FirstOrDefault();
            return uid;
        }

        return uid;

Si prega di non solo postare il codice soprattutto non senza commenti. Se spieghi il tuo codice sarebbe più utile.
Ali Kanat

0

se qualcun altro ha questa situazione: sto creando una verifica tramite e-mail per accedere alla mia app in modo che i miei utenti non abbiano ancora effettuato l'accesso, tuttavia ho usato quanto segue per verificare la presenza di un'e-mail inserita nel login che è una variante della soluzione @firecape

 ApplicationUser user = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindByEmail(Email.Text);

avrai anche bisogno di quanto segue:

using Microsoft.AspNet.Identity;

e

using Microsoft.AspNet.Identity.Owin;

0

In .Net MVC5 core 2.2, utilizzo HttpContext.User.Identity.Name. Ha funzionato per me.


0

Ecco come ho ottenuto un ID AspNetUser e l'ho visualizzato sulla mia home page

Ho inserito il seguente codice nel mio metodo HomeController Index ()

ViewBag.userId = User.Identity.GetUserId();

Nella pagina di visualizzazione basta chiamare

ViewBag.userId 

Esegui il progetto e sarai in grado di vedere il tuo ID utente

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.