2014-12-11 73 views
6

我已經擴展AspNetUser類與LastLoginDate屬性記住每次用戶登錄。如果用戶使用ASP .Net Identity登錄外部登錄提供程序,如何保存用戶上次登錄日期?

public sealed partial class User : IdentityUser<int, UserLogin, UserRole, UserClaim>, IUser<int>, IDatabaseEntity 
{ 
    ... 
    public DateTime? LastLoginDate { get; set; } 
} 

每次用戶使用電子郵件和密碼作爲登錄憑據進行常規登錄時,日誌工作正常。在AccountController我有我的登錄操作:

[HttpPost] 
public ActionResult Login(LoginModel model) 
{ 
    ... 
    var result = SignInManager.PasswordSignIn(model.Email, model.Password, model.RememberMe); 

    if (result == SignInStatus.Success) 
    { 
     var user = UserManager.FindByEmail(email); 
     UserManager.RememberLoginDate(user); 
     return Redirect(model.ReturnUrl); 
    } 

    ... 
} 

RememberLoginDate只是一個擴展方法,它基本上只是將當前時間的用戶LastLoginDate屬性:

public static IdentityResult RememberLoginDate(this ApplicationUserManager manager, User user) 
{ 
    user.LastLoginDate = DateTime.UtcNow;; 
    return manager.Update(user); 
} 

但是當我做外部登錄象下面這樣:

[AllowAnonymous] 
public ActionResult ExternalLoginCallback(string returnUrl, string provider) 
{ 
    var loginInfo = AuthenticationManager.GetExternalLoginInfo(); 
    if (loginInfo == null) 
      return RedirectToAction("ExternalLoginFail"); 

    // Sign in the user with this external login provider if the user already has a login 
    var result = SignInManager.ExternalSignIn(loginInfo); 
    if (result == SignInStatus.Success) 
      return RedirectToLocal(returnUrl); 

    if (result == SignInStatus.Failure) 
    { 
      return View("ExternalLoginConfirmation" ...) 
    } 

    ... 
} 

在這種情況下,我如何記錄用戶登錄日期?我沒有關於用戶的信息,例如emailId在這一點上讓他獲得UserManager。我已經嘗試過:User.Identity.GetUserId<int>()SignInManager.ExternalSignIn(loginInfo)之後得到用戶Id,但它在登錄後沒有更新,它仍然是default(int) - 0SignInStatus只是一個enum沒有關於登錄用戶的其他信息和使用ExternalLoginInfo.Email也不是一個選項,因爲這封電子郵件可能會從用戶的實際註冊電子郵件不同。

回答

4

您應該可以使用UserManager.FindAsync(loginInfo.Login)通過提供者和密鑰將用戶拉回來 - 這就是SignInManager自身的工作方式。