我用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" ...)
}
...
}
在这种情况下如何记录用户登录日期?我目前没有诸如email
或Id
之类的有关用户的信息,以使他与UserManager
保持一致。我已经尝试过:User.Identity.GetUserId<int>()
在Id
之后获得用户SignInManager.ExternalSignIn(loginInfo)
,但登录后未更新,它仍然是default(int)
-0
。 SignInStatus
只是一个enum
,没有有关已登录用户的其他信息,也不能选择使用ExternalLoginInfo.Email
,因为该电子邮件可能与用户的实际注册电子邮件不同。
您应该能够使用UserManager.FindAsync(loginInfo.Login)
通过提供者和密钥将用户拉回-这是SignInManager本身的工作方式。
@@ Dmytro,能否请您在"public static IdentityResult RememberLoginDate(this ApplicationUserManager manager, User user)"
所在的位置共享文件我需要知道该部分放在AccountController文件中的位置的帮助。