Wie erhalte ich den aktuellen Benutzer und wie verwende ich die Benutzerklasse in MVC5?

159
  • Wie kann ich die ID des aktuell angemeldeten Benutzers in MVC 5 abrufen ? Ich habe die StackOverflow-Vorschläge ausprobiert, aber sie scheinen nicht für MVC 5 zu sein.
  • Was ist die bewährte Methode für MVC 5, um den Benutzern Inhalte zuzuweisen? (zB Usersollte ein haben Items. Soll ich den Benutzer Idin speichern Item? Kann ich die UserKlasse mit einer List<Item>Navigationseigenschaft erweitern?

Ich verwende "Einzelbenutzerkonten" aus der MVC-Vorlage.

Versuchte diese:

'Membership.GetUser ()' ist null.

Adam Szabo
quelle
Die Referenzen von dem, was ich versucht habe, wurden hinzugefügt. Der letzte war in MVC4 in Ordnung, aber nicht in MVC5. Außerdem brauche ich einige bewährte Methoden zum "Verwenden von Benutzern" :)
Adam Szabo
Wenn Sie sagen, dass Sie MVC 5 verwenden, was verwenden Sie für die Mitgliedschaft? OWin.Security?
Aron
"Einzelne Benutzerkonten" aus der MVC-Vorlage.
Adam Szabo
3
HttpContext.Current.User.Identity.Nameist der Name des aktuell angemeldeten Benutzers.
Wiktor Zychla
1
Wie bekomme ich die ID ? Ich möchte den aktuellen Benutzer dem von Itemihm erstellten Benutzer zuweisen , jedoch nicht basierend auf dem Benutzernamen (der sich möglicherweise ändert). Es funktioniert übrigens nicht so, dass "HttpContext.Current" System.Web.HttpContextBase keine Definition für "Current" enthält und keine Erweiterungsmethode "Current" gefunden werden kann, die ein erstes Argument vom Typ "System.Web.HttpContextBase" akzeptiert ( Fehlt Ihnen eine using-Direktive oder eine Assembly-Referenz?) `. Sind Sie sicher, dass Ihre Lösung für MVC 5 ist?
Adam Szabo

Antworten:

313

Wenn Sie in einem ASP.NET MVC-Controller codieren, verwenden Sie

using Microsoft.AspNet.Identity;

...

User.Identity.GetUserId();

Erwähnenswert ist dies User.Identity.IsAuthenticatedund User.Identity.Namewird funktionieren, ohne die oben genannte usingAussage hinzuzufügen . Aber GetUserId()wird ohne sie nicht vorhanden sein.

Wenn Sie in einer anderen Klasse als einem Controller sind, verwenden Sie

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

In der Standardvorlage von MVC 5 ist die Benutzer-ID eine als Zeichenfolge gespeicherte GUID.

Noch keine bewährte Methode, aber einige wertvolle Informationen zur Erweiterung des Benutzerprofils gefunden:

Adam Szabo
quelle
9
Die Benutzerauthentifizierung und -autorisierung wurde für ASP.NET MVC 5 geändert. Jetzt handelt es sich um eine anspruchsbasierte Authentifizierung mit Schnittstellen und generischen Repositorys, die Sie mit EF oder einem anderen Anbieter verwenden können (die EF-Implementierung ist standardmäßig verfügbar). Da GetUserIdsich eine Erweiterungsmethode am unteren Rand von befindet Ass_Start\IdentityConfig.cs, wo immer Sie sie verwenden müssen, müssen Sie in einem anderen Namespace festlegen, using Microsoft.AspNet.Identitydass die Erweiterung sichtbar wird.
Anderson Matos
1
Survey.UserId = Guid.Parse (User.Identity.GetUserId ());
NicoJuicy
Wenn ich die Verwendungsreferenz hinzufüge, ist der Benutzer immer noch rot unterstrichen? Warum sollte das so sein?
Zapnologica
@Zapnologica: Versuchen Sie, das Projekt neu zu erstellen. Vielleicht ist VS IntelliSense etwas langsam.
Adam Szabo
5
HINWEIS Benutzer ist nur in einem Controller - msdn.microsoft.com/en-us/library/... (@Zapnologica verwenden Sie es außerhalb eines Controllers versuchen HttpContext.Current.User.Identity.GetUserId ();?)
Adween
28

Versuchen Sie etwas wie:

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

Funktioniert mit RTM.

Rok Bermež
quelle
11
Dies führt zu unnötigen Datenbankauslösungen.
Arash
3
@Arash, wie soll die Anwendung das Objekt des Benutzers erhalten, ohne die Datenbank zu kontaktieren?
Fabspro
2
@Arash egal, ich verstehe was du meinst. Die ID kann mit User.Identity.GetUserId () abgerufen werden. ohne Datenbankauslösung.
Fabspro
Denken Sie bei mvc5 (Mitgliedschaft 2) daran: User.Identity.GetUserId () unterscheidet sich mit der ID in Tabelle [AspNetUsers]. Also Jakub Arnold und Rok ist der richtige Weg
Gray Wolf
Ich bin ein bisschen verwirrt mit der Antwort. Ich erhalte einen UserStore-Typ, der in meinem Controller-Kontext nicht vorhanden zu sein scheint. Irgendwelche Ideen?
Jhourlad Estrella
19

Wenn Sie das ApplicationUser-Objekt in einer Codezeile haben möchten (wenn Sie die neueste ASP.NET-Identität installiert haben), versuchen Sie Folgendes:

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

Sie benötigen Folgendes mit Anweisungen:

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
Feuerlandschaft
quelle
Objekt für <ApplicationUserManager>
Fandango68
7

Das Erhalten der ID ist ziemlich einfach und Sie haben das gelöst.

Ihre zweite Frage ist jedoch etwas komplizierter.

Das ist also alles Vorabversion, aber das häufigste Problem, mit dem Sie konfrontiert sind, besteht darin, dass Sie den Benutzer um neue Eigenschaften erweitern (oder eine Items-Sammlung in Ihrer Frage).

Nach dem Auspacken erhalten Sie eine Datei, IdentityModeldie (zum Zeitpunkt des Schreibens) im Ordner "Modelle" aufgerufen wird . Dort haben Sie ein paar Klassen;ApplicationUserund ApplicationDbContext. Um Ihre Sammlung hinzuzufügen, Itemsmöchten Sie die ApplicationUserKlasse so ändern , wie Sie es tun würden, wenn dies eine normale Klasse wäre, die Sie mit Entity Framework verwendet haben. Wenn Sie einen kurzen Blick unter die Haube werfen, werden Sie feststellen, dass alle identitätsbezogenen Klassen (Benutzer, Rolle usw.) nur noch POCOs mit den entsprechenden Datenanmerkungen sind, sodass sie mit EF6 gut funktionieren.

Als nächstes müssen Sie einige Änderungen an der vornehmen AccountController Konstruktor damit dieser Ihren DbContext verwenden kann.

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

Um ehrlich zu sein, ist es ein wenig esoterisch, das gesamte Benutzerobjekt für Ihren angemeldeten Benutzer zu erhalten.

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

Diese Zeile erledigt den Job und Sie können userWithItems.Itemswie gewünscht darauf zugreifen .

HTH

EightyOne Unite
quelle
Ich nehme nicht an, dass es für all das so etwas wie Pre-Release-Dokumente gibt.
Derek Tomes
@Derek Tomes - Nicht, dass ich darauf gestoßen wäre. Ich denke, wir müssen bis zum 13. November auf echte Dokumente warten. Es war nicht großartig, um ehrlich zu sein, es gibt sogar eine Bitte um bessere Anleitung bei uservoice - aspnet.uservoice.com/forums/41199-general-asp-net/suggestions/…
EightyOne Unite
ok, aber wie komme ich zu einer Instanz vom Typ AccountController?
Nest
0

Ich fühle deinen Schmerz, ich versuche das Gleiche zu tun. In meinem Fall möchte ich nur den Benutzer löschen.

Ich habe eine Basis-Controller-Klasse erstellt, von der alle meine Controller erben. Darin überschreibe ich OnAuthenticationund setze dasfilterContext.HttpContext.User to null

Das ist das Beste, was ich bisher geschafft habe ...

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;
        }
    }
    ...
}
Derek Tomes
quelle
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;
Hari Lakkakula
quelle
Bitte nicht nur Postleitzahl vor allem nicht ohne Kommentare. Wenn Sie Ihren Code erklären, wäre dies hilfreicher.
Ali Kanat
0

Wenn jemand anderes diese Situation hat: Ich erstelle eine E-Mail-Bestätigung, um mich bei meiner App anzumelden, damit meine Benutzer noch nicht angemeldet sind. Ich habe jedoch die folgenden Informationen verwendet, um nach einer E-Mail zu suchen, die bei der Anmeldung eingegeben wurde. Dies ist eine Variation der @ firecape-Lösung

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

Sie benötigen außerdem Folgendes:

using Microsoft.AspNet.Identity;

und

using Microsoft.AspNet.Identity.Owin;
Duan Walker
quelle
0

In .Net MVC5 Core 2.2 verwende ich HttpContext.User.Identity.Name. Es hat bei mir funktioniert.

Bhupinder Yadav
quelle
0

So habe ich eine AspNetUser-ID erhalten und auf meiner Homepage angezeigt

Ich habe den folgenden Code in meine HomeController Index () -Methode eingefügt

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

Rufen Sie auf der Ansichtsseite einfach an

ViewBag.userId 

Führen Sie das Projekt aus und Sie können Ihre Benutzer-ID sehen

Kelvin Nyadzayo
quelle