如果用户使用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" ...)
}
...
}
在这种情况下,我如何记录用户登录日期?我没有关于用户的信息,例如email
或Id
在这一点上让他获得UserManager
。我已经尝试过:User.Identity.GetUserId<int>()
在SignInManager.ExternalSignIn(loginInfo)
之后得到用户Id
,但它在登录后没有更新,它仍然是default(int)
- 0
。 SignInStatus
只是一个enum
没有关于登录用户的其他信息和使用ExternalLoginInfo.Email
也不是一个选项,因为这封电子邮件可能会从用户的实际注册电子邮件不同。
答
您应该可以使用UserManager.FindAsync(loginInfo.Login)
通过提供者和密钥将用户拉回来 - 这就是SignInManager自身的工作方式。