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 .