创建后验证散列密码和编辑事件
Verify hashed password & edit event after it's created
我正在从事一个项目,该项目可以让员工在一天中上下班打卡,包括他们的午餐。员工将输入他们的用户名和密码,然后单击打卡按钮。然后它会检查以确保用户名和密码在数据库中匹配。
我的用户名验证正常,但是我在输入密码时遇到困难。它总是returnsnull
。
然后,在验证用户名和密码后,它会创建一个事件,该事件将在您打卡时显示。我现在需要弄清楚如何检查该事件是否没有列出结束时间,以编辑它事件并为他们午餐外出打卡的时间添加结束时间。如果有开始和结束时间,则需要创建一个新事件。
型号:
[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");
}
}
您的 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 会 return null。
此外,我会像下面这样更改您的身份验证检查:
if (result != PasswordVerificationResult.Success)
{
ModelState.AddModelError("", "Login failed!");
return View("inValid");
}
关于你的第二个问题,遗憾的是我不太清楚你想要实现的目标。您想获得最新的活动吗?然后检查是否设置了 EndTime?
编辑
根据您的评论回复,您想要检查是否存在未设置结束时间的已创建事件(事件确实描述了数据库 table/information 而不是 c# 事件)。如果是这样,它需要用结束时间更新。由于 End 是一个可为空的 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 并取第一个)。
我正在从事一个项目,该项目可以让员工在一天中上下班打卡,包括他们的午餐。员工将输入他们的用户名和密码,然后单击打卡按钮。然后它会检查以确保用户名和密码在数据库中匹配。
我的用户名验证正常,但是我在输入密码时遇到困难。它总是returnsnull
。
然后,在验证用户名和密码后,它会创建一个事件,该事件将在您打卡时显示。我现在需要弄清楚如何检查该事件是否没有列出结束时间,以编辑它事件并为他们午餐外出打卡的时间添加结束时间。如果有开始和结束时间,则需要创建一个新事件。
型号:
[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");
}
}
您的 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 会 return null。
此外,我会像下面这样更改您的身份验证检查:
if (result != PasswordVerificationResult.Success)
{
ModelState.AddModelError("", "Login failed!");
return View("inValid");
}
关于你的第二个问题,遗憾的是我不太清楚你想要实现的目标。您想获得最新的活动吗?然后检查是否设置了 EndTime?
编辑
根据您的评论回复,您想要检查是否存在未设置结束时间的已创建事件(事件确实描述了数据库 table/information 而不是 c# 事件)。如果是这样,它需要用结束时间更新。由于 End 是一个可为空的 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 并取第一个)。