Ho esteso la classe AspNetUser
con la proprietà LastLoginDate
da ricordare ogni volta che l'utente effettua il login.Come salvare l'ultima data di accesso dell'utente se era connesso con un provider di accesso esterno utilizzando ASP .Net Identity?
public sealed partial class User : IdentityUser<int, UserLogin, UserRole, UserClaim>, IUser<int>, IDatabaseEntity
{
...
public DateTime? LastLoginDate { get; set; }
}
Loging funziona bene ogni volta che l'utente fa di consueto login tramite e-mail e la password come credenziali di accesso. In AccountController
ho la mia azione login:
[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
è solo un metodi di estensione che fondamentalmente solo Imposta l'ora corrente per utente LastLoginDate
proprietà:
public static IdentityResult RememberLoginDate(this ApplicationUserManager manager, User user)
{
user.LastLoginDate = DateTime.UtcNow;;
return manager.Update(user);
}
Ma quando faccio login esterno come di seguito:
[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" ...)
}
...
}
Come posso registrare la data di accesso utente in questo caso? Non ho informazioni sull'utente come email
o Id
per ottenerlo con UserManager
a questo punto. Ho già provato: User.Identity.GetUserId<int>()
per ottenere l'utente Id
dopo SignInManager.ExternalSignIn(loginInfo)
ma non viene aggiornato dopo l'accesso, è ancora default(int)
- 0
. SignInStatus
è solo un enum
senza ulteriori informazioni sull'utente registrato e utilizzare ExternalLoginInfo.Email
non è un'opzione, poiché questa email può essere diversa dall'e-mail effettiva registrata dell'utente.