2017-09-09 29 views
1

我試圖檢查登錄後的用戶電子郵件確認狀態,然後指示他們。_userManager.GetUserAsync(用戶)返回null

基於這兩個線程:

ASP.NET Core Identity - get current user

How get current user in asp.net core

我嘗試這樣做:

var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false); 
if (result.Succeeded) 
{ 
    ClaimsPrincipal currentUser = this.User; 
    var thisUser = await _userManager.GetUserAsync(currentUser); 
    if(thisUser.EmailConfirmed) 
    { 
     return View("~/Views/Task/Index.cshtml"); 
    } 
    else 
    { 
     return View("ConfirmEmail"); 
    } 
} 

而且也是這樣:

var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false); 
if (result.Succeeded) 
{ 
    var thisUser = await _userManager.GetUserAsync(HttpContext.User); 
    if(thisUser.EmailConfirmed) 
    { 
     return View("~/Views/Task/Index.cshtml"); 
    } 
    else 
    { 
     return View("ConfirmEmail"); 
    } 
} 

從內部控制器,但thisUser始終爲空。

如何在登錄時檢查他們的電子郵件是否已確認並重新定向?

回答

1

您的方法存在問題,對於MembershipIdentity屬於這種情況:它們基於cookies。 Cookie只有在客戶端發送時才能被閱讀。

所以,這是你的流程:

  1. 設置cookie的
  2. 讀取Cookie

這是錯誤的,因爲如上所述。你的流量值應爲:

  1. 設置cookie的
  2. 重定向某處
  3. 讀取Cookie(現在是由客戶端發送)

OR

  1. 設置cookie的
  2. 基於email你從哪裏存儲數據已經有
0

我在模型中有電子郵件,所以我只是直接在數據庫中查找它。

var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false); 
if (result.Succeeded) 
{ 
    _logger.LogInformation("User logged in."); 

    var user = _context.Users.Single(x => x.Email == model.Email); 

    if(user.EmailConfirmed) 
    { 
     return View("~/Views/Task/Index.cshtml"); 
    } 
    else 
    { 
     return View("ConfirmEmail"); 
    } 

} 
+0

如果你能從我的答案得到你的解決方案,你應該接受我的答案不張貼你自己的答案。 –

+0

我的第二個解決方案正是'根據您已經擁有的電子郵件從任何地方讀取數據',這就是您所做的。 –

+0

這並非完全正確。您可以在不重定向的情況下設置cookie(當然需要)。這正是你在這個答案中所做的,這正是我在第二個解決方案中暗示的內容 –