2014-12-11 2 views
6

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.

risposta

4

Dovresti essere in grado di utilizzare UserManager.FindAsync(loginInfo.Login) per richiamare l'utente tramite il provider e la chiave: questo è il modo in cui funziona lo stesso SignInManager.