我已經擴展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
也不是一個選項,因爲這封電子郵件可能會從用戶的實際註冊電子郵件不同。