2016-04-15 10 views
39

Я хочу, чтобы текущий пользователь получал информацию о пользователе, такую ​​как электронная почта. Но я не могу сделать это в ядре asp.net. Я так смущен Это мой код.Как получить текущего пользователя в ядре asp.net

HttpContext почти есть в конструктор контроллера. Нехорошо получить пользователя в каждом действии. Я хочу получить информацию о пользователе один раз и установить их в ViewData;

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

Использование с MVC или Web API? – Tushar

+1

Я использую mvc. –

ответ

68
User.FindFirst(ClaimTypes.NameIdentifier).Value 

EDIT для конструктора

Ниже код работает:

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

Edit для RTM

Вы должны зарегистрироваться IHttpContextAccessor:

public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
    } 
+1

работает в actions.but, я хочу использовать в конструкторе контроллера. –

+1

Возможно ли это использовать в классах? –

+1

из-за инъекции зависимостей, вы можете использовать –

14

Есть еще один способ получить текущего пользователя в Asp.Net Ядра - и я думаю, что я видел его где-то здесь, на 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 GetUserAsync(); 
    string userEmail = user.Email; // Here you gets user email 
    string userId = user.Id; 
} 

Этот код идет в контроллер с именем DemoController. Не будет работать без обоих ожиданий (не будет компилироваться);)

9

Простой способ, который работает, и я проверил.

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

, то вы можете все свойства этой переменной как user.Email. Надеюсь, это поможет кому-то.

7

Казалось бы, как сейчас (апрель 2017 года), что следующие работы:

public string LoggedInUser => User.Identity; 

По крайней мере, в то время как в Controller

Смежные вопросы