如果用户使用ASP .Net Identity登录外部登录提供程序,如何保存用户上次登录日期?

问题描述:

我已经扩展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也不是一个选项,因为这封电子邮件可能会从用户的实际注册电子邮件不同。

您应该可以使用UserManager.FindAsync(loginInfo.Login)通过提供者和密钥将用户拉回来 - 这就是SignInManager自身的工作方式。