在创建后验证散列密码和编辑事件

问题描述 投票:0回答:1

我正在开展一个项目,让员工可以随时进出,包括他们的午餐。员工将输入他们的用户名和密码,然后单击时钟按钮。然后检查以确保用户名和密码在数据库中匹配。

我的用户名验证工作正常,但我的密码很难。它总是返回null

然后,在验证了用户名和密码之后,它会创建一个事件,该信息将在您进入时显示。我现在需要弄清楚如何检查该事件是否没有列出结束时间,编辑该事件并添加结束他们出去吃午饭的时间。如果有开始和结束时间,则需要创建新事件。

模型:

    [Key]
    public Guid EventID { get; set; }
    public DateTime Start { get; set; }
    public DateTime? End { get; set; }
    public string Note { get; set; }       
    [Timestamp]
    public byte[] Timestamp { get; set; }
    public string Title { get; set; }
    public bool ActiveSchedule { get; set; }
    [Column("UserId")]
    public string Id { get; set; }
    [ForeignKey("Id")]
    public virtual ApplicationUser User { get; set; }
}

控制器:

public ActionResult Create(LoginViewModel workTimeEvent)
    {
        PasswordHasher ph = new PasswordHasher();
        ApplicationUser user = new ApplicationUser
        {
            Email = workTimeEvent.Email
        }; 

        if (db.Users.Where(x => x.Email == workTimeEvent.Email).Count() == 1)
        {
            var result = ph.VerifyHashedPassword(user.PasswordHash, workTimeEvent.Password);
            if (result == PasswordVerificationResult.Success)

            WorkTimeEvent work = new WorkTimeEvent() { };

            if (work.Start==null)
            {
                WorkTimeEvent clockIn = new WorkTimeEvent()
                {
                    User = db.Users.Where(e => e.Email == workTimeEvent.Email).First(),
                    Start = DateTime.Now,
                    EventID = Guid.NewGuid()
                };

                db.WorkTimeEvents.Add(clockIn);
                db.SaveChanges();
                return View();
            }
            else if (work.End == null)
            {

            }

                db.WorkTimeEvents.Add(work);
                db.SaveChanges();
                return View();
        }
        else
        {
            return View("inValid");
        }
    }
c# asp.net-mvc password-hash
1个回答
0
投票

您的user.PasswordHash始终为NULL :)

        // query db to check if user does exist but you do not retrieve it
        if (db.Users.Where(x => x.Email == workTimeEvent.Email).Count() == 1)
        {
            var result = ph.VerifyHashedPassword(user.PasswordHash, workTimeEvent.Password);
            if (result == PasswordVerificationResult.Success)

请尝试以下方法:

        ApplicationUser user = new ApplicationUser
        {
            Email = workTimeEvent.Email
        }; 

        // query db to check if user does exist but you do not retrieve it
        var dbUser = db.Users.FirstOrDefault(x => x.Email == workTimeEvent.Email);

        if (dbUser == null)
        {
            ModelState.AddModelError("", "Login failed!");
            return View("inValid");
        }
        var result = ph.VerifyHashedPassword(dbUser.PasswordHash, workTimeEvent.Password);

如果找不到任何内容,FirstOrDefault会返回null。

此外,我将更改您的身份验证检查如下:

    if (result != PasswordVerificationResult.Success)
{
             ModelState.AddModelError("", "Login failed!");
             return View("inValid");
}

关于你的第二个问题,遗憾的是我不清楚你想要实现的目标。你想参加最新的活动吗?然后检查是否有EndTime设置?

编辑

根据您的评论响应,您要检查是否有创建的事件(事件确实描述了数据库表/信息而不是c#事件),没有设置结束时间。如果是这样,则需要使用结束时间进行更新。由于End being为可以为空的DateTime,我们使用EntityFramework和HasValue属性进行检查:

var notFinishedEvent = db.WorkTimeEvents.FirstOrDefault(x=>x.Id == dbUser.Id && !x.End.HasValue);
if(notFinishedEvent != null)
{
    notFinishedEvent.End = DateTime.Now;
    db.SaveChanges();
}
else
{
   // create new one to save...
}

此代码依赖于只有一个事件没有设置结束日期。我不知道您的Start的默认值,但您可以轻松地将其添加为最新的检查或查询(使用OrderByDescending并采取第一个)。

© www.soinside.com 2019 - 2024. All rights reserved.