2016-04-15 84 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