web-dev-qa-db-de.com

Rufen Sie die Benutzer-ID eines Benutzernamens 2.0 ab

MVC 5 mit asp.net identity 2.0

Ich verstehe, wie man die aktuell angemeldete Benutzer-ID erhält. Ich muss die Benutzer-ID eines anderen Benutzers im System abrufen. Wie wird das gemacht?

Ex. Ich muss die Benutzer-ID von Benutzernamen "fsmith" abrufen ...

16
BTI-Doug

Innerhalb des AccountControllers können Sie die folgende Methode aufrufen, um das Benutzerobjekt und dann die Benutzer-ID abzurufen.

var user = await UserManager.FindByNameAsync(userName);
var userId = user.Id;

Wenn Sie sich nicht in AccountController befinden, können Sie die UserManager-Referenz mit dem folgenden Code abrufen

var UserManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
27

Zu Shashis nützlicher Antwort hinzufügen ...

Wenn Sie sich im Account Controller befinden, können Sie den vorhandenen UserManager verwenden:

var user = await UserManager.FindByNameAsync(userName);
var userId = user.Id;

In anderen Controllern (und möglicherweise anderen Orten auswählen, an denen HttpContext verfügbar ist) erstellen Sie einen Benutzermanager mit:

var um = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();

Aber es hat eine Weile gedauert, bis mir klar wurde, dass man mit diesem letzten Teil fast überall etwas erreichen kann. Zum Beispiel habe ich es in meiner Seed-Methode (in Configuration.cs) verwendet, um die User-Eigenschaft eines anderen Modells zu säen:

var um = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(*insert-your-db-context-here*));
3
Methodician

Wenn Sie Bearing Token Auth verwenden, wird in dem obigen Beispiel kein Anwendungsbenutzer zurückgegeben.

Verwenden Sie stattdessen Folgendes:

ClaimsPrincipal currentUser = this.User;
var currentUserName = currentUser.FindFirst(ClaimTypes.NameIdentifier).Value;
ApplicationUser user = await _userManager.FindByNameAsync(currentUserName);
return user.Id; 

Dies funktioniert in apsnetcore 2.0. Habe es in früheren Versionen nicht probiert.

1
Greg Gum

Eine Möglichkeit wäre die Verwendung der FindByNameAsync - Methode Ihres Benutzermanagers (oder der generischen Version davon). Es nimmt den Namen des Benutzers (in Ihrem Fall "fsmith") und gibt eine Aufgabe eines Benutzerobjekts zurück. Dieses Benutzerobjekt enthält alle verfügbaren Informationen zu diesem Benutzer.

Ein Code-Snippet könnte dem folgenden ähnlich aussehen (wenn Sie nach der Datenbank-ID suchen):

var user = await UserManager.FindByNameAsync("fsmith");
var userId = user.Id;

EDIT

Die UserManager-Instanz wird normalerweise wie folgt deklariert (Denken Sie daran, dass es viele Möglichkeiten gibt, sie zu deklarieren, beispielsweise bei der Verwendung von Dependency Injection):

public AccountController()
  : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))
{
}

public AccountController(UserManager<ApplicationUser> userManager)
{
  UserManager = userManager;
}

public UserManager<ApplicationUser> UserManager { get; private set; }
1
Horizon_Net