Проверьте хешированный пароль и отредактируйте событие после его создания.
Я работаю над проектом, который позволит сотрудникам входить и выходить в течение дня, включая обед. Сотрудник вводит свое имя пользователя и пароль и нажимает кнопку с часами. Затем он проверит, чтобы убедиться, что имя пользователя и пароль совпадают в базе данных.
Я получил подтверждение имени пользователя для работы, но мне трудно с паролем. Всегда возвращается 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");
}
}
1 ответ
Ваш 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?
РЕДАКТИРОВАТЬ
На основе вашего комментария вы хотите проверить, существует ли созданное событие (событие описывает таблицу / информацию в базе данных, а не событие aC#) без установленного времени окончания. Если это так, его необходимо обновить с указанием времени окончания. В связи с тем, что 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 и беря первую).