创建后验证哈希密码和编辑事件



我正在做一个项目,让员工在一天中上下班打卡,包括午餐。 员工将输入他们的用户名和密码,然后单击时钟按钮。 然后,它将检查以确保数据库中的用户名和密码匹配。

我让用户名验证工作,但我很难使用密码。 它总是返回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");
}
}

您的用户。密码哈希始终为空:)

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

关于你的第二个问题,遗憾的是,我不太清楚你想实现什么。您想获取最新活动吗?然后检查是否有结束时间设置?

编辑

根据您的注释响应,您要检查是否存在未设置结束时间的已创建事件(事件描述数据库表/信息而不是 c# 事件)。如果是这样,则需要使用结束时间对其进行更新。由于 End beeing 是一个可为空的日期时间,我们使用 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...
}

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

最新更新