188 votes

Comment obtenir l'utilisateur actuel dans asp.net core

Je souhaite obtenir l'utilisateur actuel, afin de pouvoir accéder à des champs tels que son adresse électronique. Mais je ne peux pas le faire dans asp.net core. Voici mon code :

HttpContext est presque nulle dans constructeur du contrôleur. Il n'est pas bon de récupérer un utilisateur à chaque action. Je veux récupérer les informations de l'utilisateur une seule fois et les sauvegarder dans ViewData ;

public DashboardController()
{
    var user = HttpContext.User.GetUserId();
}

5 votes

Utilisation avec MVC ou Web APi ?

237voto

adem caglin Points 9337
User.FindFirst(ClaimTypes.NameIdentifier).Value

EDIT pour le constructeur

Le code ci-dessous fonctionne :

public Controller(IHttpContextAccessor httpContextAccessor)
{
    var userId = httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value 
}

Modifier pour RTM

Vous devez vous inscrire IHttpContextAccessor :

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddHttpContextAccessor();
    }

3 votes

Cela fonctionne dans les actions, mais je veux l'utiliser dans le constructeur du contrôleur.

4 votes

Est-il possible de l'utiliser en classe ?

1 votes

À cause de l'injection de dépendance, oui vous pouvez utiliser

77voto

Ahmad Points 859

C'est une méthode simple qui fonctionne et que j'ai vérifiée.

private readonly UserManager<IdentityUser> _userManager;
public CompetitionsController(UserManager<IdentityUser> userManager)
{
    _userManager = userManager;
}

var user = await _userManager.GetUserAsync(HttpContext.User);

vous pouvez alors accéder à toutes les propriétés de cette variable, par exemple user.Email . J'espère que cela aidera quelqu'un.

Editer :

C'est une chose apparemment simple mais un peu compliquée à cause des différents types de systèmes d'authentification dans ASP.NET Core. J'ai mis à jour parce que certaines personnes obtiennent null .

Pour l'authentification JWT (testé sur ASP.NET Core v3.0.0-preview7) :

var email = HttpContext.User.Claims.FirstOrDefault(c => c.Type == "sub")?.Value;

var user = await _userManager.FindByEmailAsync(email);

1 votes

Fonctionne très bien pour moi à l'intérieur d'un contrôleur dans asp.net Core 2.0

2 votes

Qu'est-ce qu'un _userManager ?

8 votes

Dans ASP.NET Core Identity, User Manager est un service fourni par Dependency Inject pour créer des utilisateurs. Voir documents pour plus d'informations :

29voto

Hekkaryk Points 327

J'ai une autre façon d'obtenir l'utilisateur actuel dans Asp.NET Core - et je pense que je l'ai vu quelque part ici, sur SO ^^

// Stores UserManager
private readonly UserManager<ApplicationUser> _manager; 

// Inject UserManager using dependency injection.
// Works only if you choose "Individual user accounts" during project creation.
public DemoController(UserManager<ApplicationUser> manager)  
{  
    _manager = manager;  
}

// You can also just take part after return and use it in async methods.
private async Task<ApplicationUser> GetCurrentUser()  
{  
    return await _manager.GetUserAsync(HttpContext.User);  
}  

// Generic demo method.
public async Task DemoMethod()  
{  
    var user = await GetCurrentUser(); 
    string userEmail = user.Email; // Here you gets user email 
    string userId = user.Id;
}  

Ce code est placé dans le contrôleur DemoController. Ne fonctionnera pas sans les deux await (ne compilera pas) ;)

3 votes

Cela nécessite l'utilisation de l'identité

1 votes

Qu'est-ce que ApplicationUser ?

0 votes

ApplicationUser est généralement hérité d'IdentityUser, ce qui permet de lui ajouter des propriétés supplémentaires, etc.

24voto

Grandizer Points 316

Il semblerait qu'à l'heure actuelle (avril 2017), le système suivant fonctionne :

public string LoggedInUser => User.Identity.Name;

Au moins pendant qu'il se trouve à l'intérieur d'un Controller

4 votes

Vous ne pouvez pas convertir implicitement le type "System.Security.Principal.IIdentity" en "string".

3 votes

String LoggedInUser = User.Identity.Name ;

9 votes

En tant que personne n'ayant pas vu le => utilisé comme cela auparavant, il est appelé "définition du corps de l'expression" et est décrit dans le document cette documentation . Juste au cas où des personnes comme moi se poseraient la question à l'avenir.

5voto

MikeMajara Points 99

Mon problème était d'accéder à l'utilisateur connecté en tant qu'objet dans le fichier cshtml. Étant donné que vous vouliez que l'utilisateur soit dans ViewData, cette approche pourrait être utile :

Dans le fichier cshtml

@using Microsoft.AspNetCore.Identity
@inject UserManager<ApplicationUser> UserManager

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>
    @UserManager.FindByNameAsync(UserManager.GetUserName(User)).Result.Email
    </title>
  </head>
  <body>

  </body>
</html>

0 votes

Comment faire pour qu'une propriété de navigation se charge (nom de la société d'une propriété de navigation de ma classe ApplicationUser) ? Je n'ai pas vu de moyen d'inclure des propriétés de navigation.

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