Cómo obtener el usuario actual en asp.net core

Quiero obtener un usuario actual para obtener información del usuario, como el correo electrónico. Pero no puedo hacer eso en el núcleo de asp.net. Estoy tan confundido. Este es mi código.

HttpContext casi es nulo en el constructor del controlador. No es bueno que el usuario participe en cada acción. Quiero obtener información del usuario una vez y configurarla en ViewData ;

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

 User.FindFirst(ClaimTypes.NameIdentifier).Value 

EDITAR para el constructor

Abajo el código funciona:

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

Editar para RTM

Debería registrar IHttpContextAccessor :

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

Manera simple que funciona y comprobé.

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

entonces puedes todas las propiedades de estas variables como user.Email . Espero que esto ayude a alguien.

Tener otra forma de obtener al usuario actual en Asp.NET Core, y creo que lo vi en algún lugar aquí, en SO ^^

 // Stores UserManager private readonly UserManager _manager; // Inject UserManager using dependency injection. // Works only if you choose "Individual user accounts" during project creation. public DemoController(UserManager manager) { _manager = manager; } // You can also just take part after return and use it in async methods. private async Task GetCurrentUser() { return await _manager.GetUserAsync(HttpContext.User); } // Generic demo method. public async Task DemoMethod() { var user = await GetUserAsync(); string userEmail = user.Email; // Here you gets user email string userId = user.Id; } 

Ese código va al controlador llamado DemoController. No funcionará sin que ambos estén a la espera (no comstackrá);)

Parece que a partir de ahora (abril de 2017) que los siguientes trabajos:

 public string LoggedInUser => User.Identity; 

Al menos dentro de un Controller

Mi problema era acceder al Usuario conectado como un objeto en el archivo cshtml. Teniendo en cuenta que quería el usuario en ViewData, este enfoque podría ser útil:

En el archivo cshtml

 @using Microsoft.AspNetCore.Identity @inject UserManager UserManager      @UserManager.FindByNameAsync(UserManager.GetUserName(User)).Result.Email      

Tengo mi solución

 var claim = HttpContext.User.CurrentUserID(); public static class XYZ { public static int CurrentUserID(this ClaimsPrincipal claim) { var userID = claimsPrincipal.Claims.ToList().Find(r => r.Type == "UserID").Value; return Convert.ToInt32(userID); } public static string CurrentUserRole(this ClaimsPrincipal claim) { var role = claimsPrincipal.Claims.ToList().Find(r => r.Type == "Role").Value; return role; } }