ASP.NET MVC 5 – Identität. So erhalten Sie den aktuellen ApplicationUser

Ich habe Artikelentität in meinem Projekt, die die ApplicationUser Eigenschaft mit dem Namen Author . Wie kann ich das vollständige Objekt des aktuell angemeldeten ApplicationUser ? Beim Erstellen eines neuen Artikels muss ich die Author Eigenschaft in Article auf den aktuellen ApplicationUser .

Im alten Membership-Mechanismus war es einfach, aber im neuen Identity-Ansatz weiß ich nicht, wie ich das machen soll.

Ich habe versucht, das so zu machen:

  • Fügen Sie using-statement für Identity-Erweiterungen hinzu: using Microsoft.AspNet.Identity;
  • Dann versuche ich, aktuellen Benutzer zu erhalten: ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == User.Identity.GetUserId());

Aber ich bekomme eine Ausnahme:

LINQ to Entities erkennt die Methode ‘System.String GetUserId (System.Security.Principal.IIdentity)’ nicht und diese Methode kann nicht in einen Geschäftsausdruck übersetzt werden. Quelle = EntityFramework

    Sie sollten die database für den aktuellen ApplicationUser nicht direkt abfragen müssen.

    Das führt zu einer neuen Abhängigkeit von einem zusätzlichen Kontext für Starter, aber die Benutzerdatenbanktabellen ändern sich (in den letzten 2 Jahren dreimal), aber die API ist konsistent. Zum Beispiel heißt die users jetzt in Identity Framework AspNetUsers , und die Namen einiger Primärschlüsselfelder ändern sich ständig, so dass der Code in mehreren Antworten nicht mehr so ​​funktioniert, wie er ist .

    Ein weiteres Problem besteht darin, dass der zugrunde liegende OWIN-Zugriff auf die database einen separaten Kontext verwendet, so dass Änderungen von einem separaten SQL-Zugriff zu ungültigen Ergebnissen führen können (z. B. keine Änderungen an der database). Die Lösung besteht wiederum darin , mit der bereitgestellten API zu arbeiten und nicht zu versuchen, sie zu umgehen .

    Der korrekte Zugriff auf das aktuelle Benutzerobjekt in der ASP.Net-Identität (wie zu diesem Zeitpunkt) lautet:

     var user = UserManager.FindById(User.Identity.GetUserId()); 

    oder, wenn Sie eine asynchrone Aktion haben, etwas wie:

     var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); 

    FindById erfordert, dass Sie die using-statement verwenden, damit die nicht- UserManager Methoden verfügbar sind (sie sind Erweiterungsmethoden für UserManager. Wenn Sie dies nicht angeben, wird nur FindByIdAsync ):

     using Microsoft.AspNet.Identity; 

    Wenn Sie sich überhaupt nicht in einem Controller befinden (z. B. wenn Sie eine IOC-Injektion verwenden), wird die Benutzer-ID vollständig abgerufen von:

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

    Wenn Sie nicht im Standard-Account-Controller sind, müssen Sie Ihrem Controller Folgendes hinzufügen (als Beispiel):

    1. Fügen Sie diese zwei Eigenschaften hinzu:

      ///  /// Application DB context ///  protected ApplicationDbContext ApplicationDbContext { get; set; } ///  /// User manager - attached to application DB context ///  protected UserManager UserManager { get; set; } 

    2. Fügen Sie dies im Konstruktor des Controllers hinzu:

      this.ApplicationDbContext = new ApplicationDbContext(); this.UserManager = new UserManager(new UserStore(this.ApplicationDbContext)); 

    Aktualisierung März 2015

    Hinweis: Das neueste Update für Identity Framework ändert eine der zugrunde liegenden classn, die für die Authentifizierung verwendet werden. Sie können nun über den Owin-Kontext des aktuellen HttpContent darauf zugreifen.

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

    Nachtrag:

    Wenn Sie EF und Identity Framework mit Azure über eine entfernte databaseverbindung verwenden (z. B. lokale Host-Tests mit Azure-database), können Sie zufällig den gefürchteten “Fehler: 19 – Physische Verbindung ist nicht verwendbar” treffen. Da die Ursache in Identity Framework .Include(x->someTable) , wo Sie keine Wiederholungen hinzufügen können (oder eine fehlende .Include(x->someTable) ), müssen Sie eine benutzerdefinierte SqlAzureExecutionStrategy in Ihrem Projekt implementieren.

    Mein Fehler, ich hätte keine Methode in einer LINQ-Abfrage verwenden sollen.

    Korrekter Code:

     string currentUserId = User.Identity.GetUserId(); ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId); 

    Es ist in den Kommentaren der Antworten, aber niemand hat dies als die tatsächliche Lösung veröffentlicht.

    Sie müssen nur eine using-statement oben hinzufügen:

     using Microsoft.AspNet.Identity; 

    Der Code von Ellbar funktioniert! Sie müssen nur hinzufügen mit.

    1 – unter using Microsoft.AspNet.Identity;

    Und … der Code von Ellbar:

    2 – string currentUserId = User.Identity.GetUserId(); ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId); string currentUserId = User.Identity.GetUserId(); ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId);

    Mit diesem Code (in currentUser ) currentUser Sie die allgemeinen Daten des verbundenen Benutzers, wenn Sie zusätzliche Daten currentUser … siehe diesen Link

    Ab ASP.NET Identity 3.0.0 wurde dies in umgestaltet

     //returns the userid claim value if present, otherwise returns null User.GetUserId(); 
     ApplicationDbContext context = new ApplicationDbContext(); var UserManager = new UserManager(new UserStore(context)); ApplicationUser currentUser = UserManager.FindById(User.Identity.GetUserId()); string ID = currentUser.Id; string Email = currentUser.Email; string Username = currentUser.UserName; 

    Im Moment erstellt die asp.mvc-Projektvorlage einen Account-Controller, der den usermanager auf folgende Art und Weise erhält:

     HttpContext.GetOwinContext().GetUserManager() 

    Folgendes funktioniert für mich:

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

    Für MVC 5 schauen Sie sich einfach die EnableTwoFactorAuthentication-Methode von ManageController im WebApplication Template Scaffold an, die dort ausgeführt wird:

      [HttpPost] [ValidateAntiForgeryToken] public async Task EnableTwoFactorAuthentication() { await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), true); var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); if (user != null) { await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); } return RedirectToAction("Index", "Manage"); } 

    Die Antwort ist genau da, wie von Microsoft selbst vorgeschlagen:

     var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); 

    Es enthält alle zusätzlichen Eigenschaften, die Sie in der ApplicationUser-class definiert haben.

    Ich war erfolgreich verfügbar, um Anwendungsbenutzer durch Befolgung von Code-Stück zu erhalten

     var manager = new UserManager(new UserStore(new ApplicationDbContext())); var user = manager.FindById(User.Identity.GetUserId()); ApplicationUser EmpUser = user;