我已经使用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
也不是一个选项,因为此电子邮件可能与用户的实际注册电子邮件不同。
答案 0 :(得分:4)
您应该可以使用UserManager.FindAsync(loginInfo.Login)
通过提供程序和密钥撤回用户 - 这就是SignInManager本身的工作方式。