成功登录
在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任务没有完成,我试图获取这仍然是不可用的信息。
我不知道这是最好的办法或不,但我试图在用户尝试登录时记录用户信息。
由于用户已成功登录,因此您可以从模型本身检索用户名。
其他用户信息,可以这样得到:
var userName = model.Username;
ApplicationUser user = UserManager.FindByName(userName);
string userid = user.UserId.ToString();
//Email
//Other properties...
你将不能够因为它是从验证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);
}
}
}
那么,如何在使用** PasswordSignInAsync **方法填充结果之后立即使用HttpContext来实现此目的呢? –
你不能...... –
您需要在登录后弹跳动作,如果添加你想在登录后直接执行某些操作。它将确保登录完成和用户数据可用:
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);
}
以及我将如何使用** LoginBounce **方法? –
@ShahzadMirza我在回答中已经概述了。在成功登录后,重定向到新的操作(在我的答案中提供),执行您需要执行的操作,然后推送到原来的'returnUrl' – scgough
HttpContext.User.Identity将在登录操作中为空。你可以在我的回答中找到更多详细信息 –
是的,我已经更新了答案。 – Sajal