Sie sollten die Datenbank nicht direkt nach dem aktuellen ApplicationUser abfragen müssen.
Dies führt zu einer neuen Abhängigkeit von einem zusätzlichen Kontext für den Anfang, aber in Zukunft ändern sich die Benutzerdatenbanktabellen (dreimal in den letzten 2 Jahren), aber die API ist konsistent. Beispielsweise wird die users
Tabelle jetzt AspNetUsers
in Identity Framework aufgerufen , und die Namen mehrerer Primärschlüsselfelder ändern sich ständig, sodass der Code in mehreren Antworten nicht mehr wie er ist funktioniert .
Ein weiteres Problem besteht darin, dass der zugrunde liegende OWIN-Zugriff auf die Datenbank einen separaten Kontext verwendet, sodass Änderungen durch separaten SQL-Zugriff zu ungültigen Ergebnissen führen können (z. B. wenn keine Änderungen an der Datenbank vorgenommen werden). Wieder besteht die Lösung darin, mit der mitgelieferten API zu arbeiten und nicht zu versuchen, sie zu umgehen .
Der korrekte Zugriff auf das aktuelle Benutzerobjekt in der ASP.Net-Identität (zu diesem Datum) ist:
var user = UserManager.FindById(User.Identity.GetUserId());
oder, wenn Sie eine asynchrone Aktion haben, so etwas wie:
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
FindById
Voraussetzung ist, dass Sie die folgende using-Anweisung haben, damit die nicht asynchronen UserManager
Methoden verfügbar sind (es handelt sich um Erweiterungsmethoden für UserManager. Wenn Sie diese nicht einschließen, wird nur angezeigt FindByIdAsync
):
using Microsoft.AspNet.Identity;
Wenn Sie sich überhaupt nicht in einem Controller befinden (z. B. wenn Sie die 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 (als Beispiel) hinzufügen:
1. Fügen Sie diese beiden Eigenschaften hinzu:
/// <summary>
/// Application DB context
/// </summary>
protected ApplicationDbContext ApplicationDbContext { get; set; }
/// <summary>
/// User manager - attached to application DB context
/// </summary>
protected UserManager<ApplicationUser> UserManager { get; set; }
2. Fügen Sie dies im Konstruktor des Controllers hinzu:
this.ApplicationDbContext = new ApplicationDbContext();
this.UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(this.ApplicationDbContext));
Update März 2015
Hinweis: Mit der letzten Aktualisierung des Identity Frameworks wird eine der zugrunde liegenden Klassen geändert, die für die Authentifizierung verwendet werden. Sie können jetzt über den Owin-Kontext des aktuellen HttpContent darauf zugreifen.
ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());
Nachtrag:
Wenn Sie EF und Identity Framework mit Azure über eine entfernte Datenbankverbindung (z. B. Testen des lokalen Hosts zur Azure-Datenbank) verwenden, können Sie zufällig den gefürchteten „Fehler: 19 - Physische Verbindung ist nicht verwendbar“ treffen. Da die Ursache in Identity Framework verborgen ist, wo Sie keine Wiederholungsversuche hinzufügen können (oder was als fehlend erscheint .Include(x->someTable)
), müssen Sie eine benutzerdefinierte Funktion SqlAzureExecutionStrategy
in Ihrem Projekt implementieren .
ApplicationUser
Klasse (anwendungsspezifisch) und dieAspNetUsers
Tabelle parallel erweitern und sie stellen alle neuen Felder bereit. Nochmals: Nicht direkt in die Datenbank! :)Mein Fehler, ich hätte keine Methode in einer LINQ-Abfrage verwenden sollen.
Richtiger Code:
quelle
UserManager
Methoden verwenden und nicht direkt auf die Datenbank zugreifen?Es ist in den Kommentaren der Antworten, aber niemand hat dies als die eigentliche Lösung gepostet.
Sie müssen nur oben eine using-Anweisung hinzufügen:
quelle
using
. Als 15.000 Leute die Frage besucht haben, dachte ich, dass es eine hilfreiche Antwort ist :).GetUserId()
es sich um eine Erweiterungsmethode handeltDer Code von Ellbar funktioniert! Sie müssen nur mit hinzufügen.
1 -
using Microsoft.AspNet.Identity;
Und ... der Code von Ellbar:
2 -
string currentUserId = User.Identity.GetUserId(); ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId);
Mit diesem Code (in
currentUser
) bearbeiten Sie die allgemeinen Daten des verbundenen Benutzers, wenn Sie zusätzliche Daten wünschen ... siehe diesen Linkquelle
ApplicationUser
ObjektAb ASP.NET Identity 3.0.0 wurde dies überarbeitet
quelle
quelle
Für MVC 5 sehen Sie sich einfach die EnableTwoFactorAuthentication-Methode von ManageController im WebApplication-Vorlagengerüst an.
Die Antwort ist genau dort, wie von Microsoft selbst vorgeschlagen:
Es enthält alle zusätzlichen Eigenschaften, die Sie in der ApplicationUser-Klasse definiert haben.
quelle
Im Moment erstellt die Projektvorlage asp.mvc einen Account Controller, der den Usermanager auf folgende Weise erhält:
Folgendes funktioniert für mich:
quelle
Ich war erfolgreich verfügbar, um Anwendungsbenutzer durch Befolgen von Code zu erhalten
quelle
Falls jemand mit
Identity
Benutzern in arbeitetweb forms
, habe ich es so gemacht:quelle