web-dev-qa-db-fra.com

Obtenir l'ID utilisateur d'une identité de nom d'utilisateur 2.0

MVC 5 avec identité asp.net 2.0

Je comprends comment obtenir l'ID utilisateur actuellement connecté. J'ai besoin d'obtenir l'ID utilisateur d'un autre utilisateur du système. Comment est-ce fait?

Ex. J'ai besoin d'obtenir l'ID utilisateur des noms d'utilisateur "fsmith" ...

16
BTI-Doug

Dans AccountController, vous pouvez appeler la méthode suivante pour obtenir un objet utilisateur, puis obtenir l'ID utilisateur.

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

Si vous ne vous trouvez pas dans AccountController, vous pouvez obtenir la référence UserManager en utilisant le code suivant.

var UserManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
27
Shashi Jeevan M. P.

Pour ajouter à la réponse utile de Shashi ...

Si vous êtes dans le contrôleur de compte, vous pouvez utiliser le UserManager existant:

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

Dans d'autres contrôleurs (et peut-être sélectionnez d'autres endroits où HttpContext est disponible), vous créez un gestionnaire d'utilisateurs avec:

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

Mais ce qui m’a pris un certain temps, c’est que vous pouvez y arriver presque n'importe où avec ce dernier morceau. Par exemple, je l'ai utilisé dans ma méthode de départ (dans Configuration.cs) pour pouvoir ensemencer la propriété User d'un autre modèle:

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

Si vous utilisez Bearing Token Auth, l'exemple ci-dessus ne renvoie pas d'utilisateur d'application.

Au lieu de cela, utilisez ceci:

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

Cela fonctionne dans apsnetcore 2.0. Je n'ai pas essayé dans les versions précédentes.

1
Greg Gum

Une solution consiste à utiliser la méthode FindByNameAsync de votre gestionnaire d’utilisateurs (ou sa version générique). Il prend le nom de l'utilisateur (dans votre cas "fsmith") et retourne une tâche d'un objet utilisateur. Cet objet utilisateur contient toutes les informations disponibles sur cet utilisateur.

Un extrait de code peut ressembler au suivant (si vous recherchez l'ID de la base de données):

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

MODIFIER

L’instance de UserManager est normalement déclarée comme suit (n’oubliez pas qu’il existe de nombreuses façons de la déclarer, par exemple lors de l’utilisation de 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