2017-03-09 3 views
0

dans le coeur Identité, je suis en train de vous connecter les informations utilisateur après la connexion réussie, mais je suis juste devient vide UserName dans le LogSignIn l'action.journal des informations utilisateur après la connexion réussie

Dans cette méthode j'appelle l'action LogSignIn en envoyant l'objet de type HttpContextBase et notifie enum pour obtenir le succès ou le message d'erreur.

action Connexion

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(model); 
    } 
    var result = await SignInManager.PasswordSignInAsync(model.Username, model.Password, model.RememberMe, shouldLockout: false); 
    switch (result) 
    { 
     case SignInStatus.Success: 
      { 
       SignInLogger.LogSignIn(HttpContext, Notify.Success); 
       return RedirectToLocal(returnUrl); 
      } 
     case SignInStatus.LockedOut: 
      return View("Lockout"); 
     case SignInStatus.RequiresVerification: 
      return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }); 
     case SignInStatus.Failure: 
     default: 
       SignInLogger.LogSignIn(HttpContext, Notify.Error); 
       ModelState.AddModelError("", "Invalid login attempt."); 
       return View(model); 
     } 
} 

Dans cette méthode, je suis en train de vous connecter les informations utilisateur à la DB, mais Idenity n'ont pas la valeur dans le nom. SignIn Logger

public static void LogSignIn(HttpContextBase httpcontext, Notify notifymessage) 
{ 
    using (var context = new WorkshopEntities()) 
    { 
     MessageLog log = new MessageLog(); 
     log.Date = DateTime.Now; 
     log.Type = (int)MessageLogType.Information; 
     log.Message = "Logged In"; 
     log.CustomMessage = notifymessage.ToString(); 
     log.UserEmail = httpcontext.User.Identity.Name ?? "N/A"; 
     log.Address= HttpContext.Current.Request.UserHostAddress; 
     context.MessageLogs.Add(log); 

     try 
     { 
      context.SaveChanges(); 
     } 
     catch (Exception ex) 
     { 
      ErrorLogger.LogError(ex); 
     } 
    } 
} 

Alors, bien ce que je comprends que tâche PasswordSignInAsync n'a pas terminé et je suis en train de chercher l'information qui est toujours pas disponible.

Je ne sais pas si c'est une meilleure approche ou non, mais j'essaie d'enregistrer les informations de l'utilisateur au moment où l'utilisateur essaie de se connecter.

Répondre

3

Étant donné que l'utilisateur s'est connecté avec succès, vous pouvez récupérer le nom d'utilisateur à partir du modèle lui-même.

Autres informations utilisateur peuvent être obtenus en tant que tel:

var userName = model.Username; 
ApplicationUser user = UserManager.FindByName(userName); 
string userid = user.UserId.ToString(); 
//Email 
//Other properties... 
+2

HttpContext.User.Identity sera vide dans l'action de connexion. Vous pouvez trouver plus de détails dans ma réponse –

+1

Oui, j'ai mis à jour la réponse. – Sajal

1

Vous ne pourrez pas récupérer l'utilisateur de HttpContext dans l'action de connexion, car il est rempli de cookie d'authentification. Puisque l'action de connexion est celle qui définit ce cookie. HttpContext.User sera rempli avec des données uniquement sur les demandes suivantes. La seule façon que vous pouvez obtenir le nom d'utilisateur dans l'action de connexion est du modèle - ce qui est tout à fait bien si vous le faites lors de la connexion réussie:

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(model); 
    } 
    var result = await SignInManager.PasswordSignInAsync(model.Username, model.Password, model.RememberMe, shouldLockout: false); 
    switch (result) 
    { 
     case SignInStatus.Success: 
      { 
       SignInLogger.LogSignIn(model.Username, Notify.Success); 
       return RedirectToLocal(returnUrl); 
      } 
     ... 
} 

public static void LogSignIn(string userEmail, Notify notifymessage) 
{ 
    using (var context = new WorkshopEntities()) 
    { 
     MessageLog log = new MessageLog(); 
     log.Date = DateTime.Now; 
     log.Type = (int)MessageLogType.Information; 
     log.Message = "Logged In"; 
     log.CustomMessage = notifymessage.ToString(); 
     log.UserEmail = userEmail; 
     log.Address= HttpContext.Current.Request.UserHostAddress; 
     context.MessageLogs.Add(log); 

     try 
     { 
      context.SaveChanges(); 
     } 
     catch (Exception ex) 
     { 
      ErrorLogger.LogError(ex); 
     } 
    } 
} 
+0

Alors, comment puis-je y parvenir en utilisant HttpContext juste après que le résultat soit rempli avec la méthode ** PasswordSignInAsync **? –

+0

Vous ne pouvez pas .... –

1

Vous devez ajouter dans une action de rebond post-connexion si vous voulez effectuer quelque chose directement après la connexion. Il s'assurera que la connexion est terminée et que les données de l'utilisateur sont disponibles:

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(model); 
    } 
    var result = await SignInManager.PasswordSignInAsync(model.Username, model.Password, model.RememberMe, shouldLockout: false); 
    switch (result) 
    { 
     case SignInStatus.Success: 
      { 
       SignInLogger.LogSignIn(model.Username, Notify.Success); 
       return RedirectToAction("LoginBounce", new { returnUrl = returnUrl }); 
      } 
     ... 
} 

[Authorize] 
public async Task<ActionResult> LoginBounce(string returnUrl) { 

    //TODO: get user details you need 

    //do Log work 
    using (var context = new WorkshopEntities()) 
    { 
     MessageLog log = new MessageLog(); 
     ... 

     try 
     { 
      context.SaveChanges(); 
     } 
     catch (Exception ex) 
     { 
      ErrorLogger.LogError(ex); 
     } 
    } 
    return RedirectToLocal(returnUrl); 
} 
+0

et comment j'utiliserai la méthode ** LoginBounce **? –

+1

@ShahzadMirza Je l'ai souligné dans ma réponse. en cas de connexion réussie, redirigez vers la nouvelle action (fournie dans ma réponse), faites ce que vous devez faire, puis appuyez sur la touche 'returnUrl' d'origine – scgough