登录成功后记录用户信息
Log user information after successful login
在 Identity core 中,我试图在成功登录后记录用户信息,但我只是在 LogSignIn 中得到 empty UserName动作。
在此方法中,我通过发送 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);
}
}
在这种方法中,我试图将用户信息记录到数据库中,但身份在名称中没有值。
登录记录器
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...
您将无法在登录操作中从 HttpContext 中检索用户,因为它是由身份验证 cookie 填充的。由于登录操作是设置此 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);
}
}
}
如果您想在登录后立即执行某些操作,则需要添加 post-登录弹跳操作。它将确保登录完成并且用户数据可用,因此:
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);
}
在 Identity core 中,我试图在成功登录后记录用户信息,但我只是在 LogSignIn 中得到 empty UserName动作。
在此方法中,我通过发送 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);
}
}
在这种方法中,我试图将用户信息记录到数据库中,但身份在名称中没有值。 登录记录器
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...
您将无法在登录操作中从 HttpContext 中检索用户,因为它是由身份验证 cookie 填充的。由于登录操作是设置此 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);
}
}
}
如果您想在登录后立即执行某些操作,则需要添加 post-登录弹跳操作。它将确保登录完成并且用户数据可用,因此:
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);
}