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

时间:2014-12-11 01:24:41

标签: c# asp.net asp.net-mvc login asp.net-identity

我已经使用AspNetUser属性扩展了LastLoginDate类,以便每次用户登录时都能记住。

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>()Id之后获取用户SignInManager.ExternalSignIn(loginInfo)但是在登录后没有更新,它仍然是default(int) - 0SignInStatus只是一个enum,没有关于已登录用户的其他信息,并且使用ExternalLoginInfo.Email也不是一个选项,因为此电子邮件可能与用户的实际注册电子邮件不同。

1 个答案:

答案 0 :(得分:4)

您应该可以使用UserManager.FindAsync(loginInfo.Login)通过提供程序和密钥撤回用户 - 这就是SignInManager本身的工作方式。