133 votes

ASP.NET Core Identity - obtenir l'utilisateur actuel

Pour obtenir l'utilisateur actuellement connecté dans MVC5, il nous suffisait de faire ce qui suit

using Microsoft.AspNet.Identity;
[Authorize]
public IHttpActionResult DoSomething() {
    string currentUserId = User.Identity.GetUserId();
}

Maintenant, avec ASP.NET Core, je pensais que cela devrait fonctionner, mais une erreur se produit.

using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Http;

private readonly UserManager<ApplicationUser> _userManager;
[HttpPost]
[Authorize]
public async Task<IActionResult> StartSession() {
    var curUser = await _userManager.GetUserAsync(HttpContext.User);
}

Des idées ?

EDITAR: La réponse de Gerardo est pertinente, mais pour obtenir l'"Id" réel de l'utilisateur, ceci semble fonctionner :

ClaimsPrincipal currentUser = this.User;
var currentUserID = currentUser.FindFirst(ClaimTypes.NameIdentifier).Value;

0 votes

Quelle est votre question exactement ?

0 votes

Vous n'avez besoin que de l'identité ? J'ai modifié ma réponse pour ajouter comment l'obtenir en utilisant la méthode plus sophistiquée _userManager.GetUserId(User).

0 votes

Oui, principalement j'ai besoin de l'Id de la table AspNetUsers, ou de la session. currentUser.FindFirst(ClaimTypes.NameIdentifier).Value donne l'Id en utilisant Claims. Cela fonctionne aussi avec UserManager ! Merci Gerardo ! Est-ce qu'une méthode est plus efficace que l'autre ?

5voto

Rokive Points 61
private readonly UserManager<AppUser> _userManager;

 public AccountsController(UserManager<AppUser> userManager)
 {
            _userManager = userManager;
 }

[Authorize(Policy = "ApiUser")]
[HttpGet("api/accounts/GetProfile", Name = "GetProfile")]
public async Task<IActionResult> GetProfile()
{
   var userId = ((ClaimsIdentity)User.Identity).FindFirst("Id").Value;
   var user = await _userManager.FindByIdAsync(userId);

   ProfileUpdateModel model = new ProfileUpdateModel();
   model.Email = user.Email;
   model.FirstName = user.FirstName;
   model.LastName = user.LastName;
   model.PhoneNumber = user.PhoneNumber;

   return new OkObjectResult(model);
}

4voto

Marko Points 11

J'ai mis quelque chose comme ça dans ma classe Controller et ça a marché :

IdentityUser user = await userManager.FindByNameAsync(HttpContext.User.Identity.Name);

où userManager est une instance de la classe Microsoft.AspNetCore.Identity.UserManager (avec toute la configuration bizarre qui va avec).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X