2017-03-09 232 views
0

在Identity核心后登录的用户信息,我试图登录成功登录后的用户信息,但我刚开始空的用户名LogSignIn行动。成功登录

在此方法中,我通过发送HttpContextBase类型对象并通知枚举来获取成功或错误消息来调用LogSignIn操作。

行动登录

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

在这种方法中,我试图登录的用户信息的数据库,但Idenity没有在名称值。 签到记录仪

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

所以,到目前为止我明白PasswordSignInAsync任务没有完成,我试图获取这仍然是不可用的信息。

我不知道这是最好的办法或不,但我试图在用户尝试登录时记录用户信息。

回答

3

由于用户已成功登录,因此您可以从模型本身检索用户名

其他用户信息,可以这样得到:

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

HttpContext.User.Identity将在登录操作中为空。你可以在我的回答中找到更多详细信息 –

+1

是的,我已经更新了答案。 – Sajal

1

你将不能够因为它是从验证cookie填写登录操作来检索HttpContext的用户。由于登录操作是设置此cookie的人员。 HttpContext.User将仅在随后的请求中填充数据。所以,你可以在登录操作获取用户名的唯一方法是从模型 - 这完全是罚款,如果你这样做对成功登录:

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

那么,如何在使用** PasswordSignInAsync **方法填充结果之后立即使用HttpContext来实现此目的呢? –

+0

你不能...... –

1

您需要在登录后弹跳动作,如果添加你想在登录后直接执行某些操作。它将确保登录完成和用户数据可用:

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

以及我将如何使用** LoginBounce **方法? –

+1

@ShahzadMirza我在回答中已经概述了。在成功登录后,重定向到新的操作(在我的答案中提供),执行您需要执行的操作,然后推送到原来的'returnUrl' – scgough