Come ottenere l’utente corrente nel nucleo di asp.net

Voglio ottenere l’utente corrente per ottenere informazioni di utenti come e-mail. Ma non posso farlo nel nucleo di asp.net. Sono così confuso Questo è il mio codice.

HttpContext è quasi nullo nel costruttore del controller. Non è positivo avere l’utente in ogni azione. Voglio ottenere le informazioni dell’utente una volta e impostarle in ViewData ;

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

 User.FindFirst(ClaimTypes.NameIdentifier).Value 

EDIT per costruttore

Sotto il codice funziona:

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

Modifica per RTM

Devi registrare IHttpContextAccessor :

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

Modo semplice che funziona e ho controllato.

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

allora puoi tutte le proprietà di queste variabili come user.Email . Spero che questo possa aiutare qualcuno.

Avere un altro modo di ottenere l’utente corrente in Asp.NET Core – e penso di averlo visto da qualche parte qui, su 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; } 

Questo codice va al controller chiamato DemoController. Non funzionerà senza entrambi attendere (non verrà compilato);)

Sembrerebbe che da ora (aprile 2017) che i seguenti lavori:

 public string LoggedInUser => User.Identity; 

Almeno mentre si è all’interno di un Controller

Il mio problema era di accedere all’utente registrato come object nel file cshtml. Considerando che si desiderava l’utente in ViewData, questo approccio potrebbe essere utile:

Nel file cshtml

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

Ho la mia soluzione

 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; } }