it-swarm.com.de

Wie erhält man den aktuellen Benutzer und wie verwendet man die Benutzerklasse in MVC5?

  • 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. 
  • Wie sieht es mit der MVC 5-Methode aus, den Benutzern Dinge zuzuweisen? (Beispielsweise sollte eine UserItems haben. Soll ich die Id des Benutzers in Item speichern. Kann ich die User-Klasse um eine List<Item>-Navigationseigenschaft erweitern?

Ich verwende "Individuelle Benutzerkonten" aus der MVC-Vorlage.

Versuchte diese:

'Membership.GetUser ()' ist null.

147
Adam Szabo

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

using Microsoft.AspNet.Identity;

...

User.Identity.GetUserId();

Erwähnenswert ist, dass User.Identity.IsAuthenticated und User.Identity.Name funktionieren, ohne dass die oben angegebene using-Anweisung hinzugefügt wird. Aber GetUserId() wird ohne sie nicht anwesend sein. 

Wenn Sie sich in einer anderen Klasse als einem Controller befinden, verwenden Sie

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

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

Noch keine Best Practice, aber einige nützliche Informationen zum Erweitern des Benutzerprofils gefunden:

294
Adam Szabo

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.

28
Rok Bermež

Wenn Sie möchten, dass das ApplicationUser-Objekt in einer Codezeile steht (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 folgende using-Anweisungen:

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
17
firecape

Die Id zu bekommen ist ziemlich einfach und Sie haben das gelöst.

Ihre zweite Frage ist jedoch etwas ausführlicher.

Dies ist im Moment alles für die Vorabversion, aber das häufigste Problem ist, dass Sie den Benutzer mit neuen Eigenschaften (oder einer Elementsammlung in Ihrer Frage) erweitern.

Im Auslieferungszustand erhalten Sie eine Datei namens IdentityModel im Ordner Models (zum Zeitpunkt des Schreibens). Dort haben Sie ein paar Klassen. ApplicationUser und ApplicationDbContext. Um Ihre Sammlung von Items hinzuzufügen, müssen Sie die ApplicationUser-Klasse ändern, genau 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, Rollen usw.) nur POCOs mit den entsprechenden Datenanmerkungen sind, sodass sie Nice mit EF6 spielen.

Als Nächstes müssen Sie einige Änderungen am Konstruktor AccountController vornehmen, damit er weiß, dass Sie DbContext verwenden.

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

Nun, es ist ein bisschen esoterisch, das gesamte Benutzerobjekt für Ihren angemeldeten Benutzer zu erhalten, um ehrlich zu sein. 

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

Diese Zeile erledigt den Job und Sie können auf userWithItems.Items wie gewünscht zugreifen.

HTH

7
Stimul8d
        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;
0
Hari Lakkakula

wenn jemand diese Situation hat: Ich erstelle eine E-Mail-Bestätigung, um mich bei meiner App anzumelden, sodass meine Benutzer noch nicht angemeldet sind. Ich habe jedoch mithilfe der folgenden Anweisung nach einer E-Mail gesucht, die bei der Anmeldung eingegeben wurde

 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;
0
Duan Walker

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

0
Bhupinder Yadav

Ich fühle deinen Schmerz, ich versuche dasselbe 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. In diesem überschreibe ich OnAuthentication und setze den filterContext.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;
        }
    }
    ...
}
0
Derek Tomes