2017-03-09 27 views
0

in Identity Kern, Ich versuche, die Benutzerinformationen nach erfolgreicher Anmeldung anmelden, aber ich bin gerade leer Username im LogSignIn Aktion zu bekommen.Log Benutzerinformationen nach erfolgreicher Anmeldung

In dieser Methode rufe ich LogSignIn Aktion durch Senden von HttpContextBase Typ Objekt und notify Enum, um die Erfolgs- oder Fehlermeldung zu erhalten.

Aktion Anmeldung

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); 
     } 
} 

Bei dieser Methode Ich versuche, die Benutzerinformationen an die DB aber Idenity einzuloggen nicht den Wert im Namen haben. 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); 
     } 
    } 
} 

So weit, was ich verstehe, dass PasswordSignInAsync Aufgabe nicht abgeschlossen, und ich versuche, die Informationen zu holen, die noch nicht verfügbar ist.

Ich weiß nicht, es ist eine beste Vorgehensweise oder nicht, aber ich versuche, die Benutzerinformationen zu dem Zeitpunkt des Benutzers zu protokollieren, versuchen Sie, sich anzumelden.

Antwort

3

Da sich der Benutzer erfolgreich angemeldet hat, können Sie den Benutzernamen vom Modell selbst abrufen.

Andere Benutzerinformationen können als solche erhalten:

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

HttpContext.User.Identity ist innerhalb der Login-Aktion leer. Sie können weitere Details in meiner Antwort finden –

+1

Ja, ich habe die Antwort aktualisiert. – Sajal

1

Sie werden nicht in der Lage sein, Benutzer abzurufen aus Httpcontext in der Login-Aktion, weil sie von Authentifizierungscookie gefüllt ist. Da Login-Aktion diejenige ist, die diesen Cookie setzt. HttpContext.User wird nur bei nachfolgenden Anforderungen mit Daten gefüllt. So ist die einzige Möglichkeit, den Benutzernamen in der Login-Aktion bekommen können aus dem Modell ist - was völlig in Ordnung ist, wenn Sie es auf der erfolgreichen Anmeldung tun:

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

Also, wie kann ich dies erreichen mit HttpContext direkt nachdem das Ergebnis mit ** PasswordSignInAsync ** Methode gefüllt ist? –

+0

Sie können nicht .... –

1

Sie müssen in einer Post-Login-Bounce-Aktion hinzufügen, wenn Sie möchten etwas direkt nach dem Login ausführen. Dadurch wird sichergestellt, dass die Anmeldung abgeschlossen ist und Benutzerdaten verfügbar sind:

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

und wie werde ich ** LoginBounce ** Methode verwenden? –

+1

@ShahzadMirza Ich habe in meiner Antwort umrissen. Nach erfolgreichem Login, umleiten zu der neuen Aktion (in meiner Antwort), tun Sie, was Sie tun müssen, und drücken Sie dann auf das ursprüngliche 'returnUrl', das Sie hatten – scgough

Verwandte Themen