登录成功后记录用户信息

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