2016-04-15 87 views
39

我想获取当前用户以获取用户的信息,例如电子邮件。 但我不能这样做在asp.net核心。我很困惑 这是我的代码。如何在asp.net核心中获取当前用户

HttpContext几乎为空构造函数控制器。 在每次操作中都得不到用户。我想获取一次用户信息并将它们设置为ViewData;

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

与MVC或网页API使用? – Tushar

+1

我正在使用mvc。 –

回答

68
User.FindFirst(ClaimTypes.NameIdentifier).Value 

编辑构造

下面的代码工作:

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

编辑为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