Проверьте хешированный пароль и отредактируйте событие после его создания

Я работаю над проектом, который позволит сотруднику отмечать свой рабочий день, включая обед. Сотрудник вводил свое имя пользователя и пароль и нажимал кнопку включения часов. Затем он проверит, совпадают ли имя пользователя и пароль в базе данных.

У меня работает проверка имени пользователя, но у меня проблемы с паролем. Он всегда возвращает 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");
        }
    }

person Queen of the North    schedule 19.04.2018    source источник
comment
..Всегда возвращает ноль... - где?   -  person MickyD    schedule 19.04.2018
comment
Не удалось вернуть результат Var, потому что user.PasswordHash является быком   -  person Queen of the North    schedule 19.04.2018
comment
PasswordHash — bull — это меня рассмешило :)   -  person MickyD    schedule 19.04.2018


Ответы (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?

ИЗМЕНИТЬ

На основе вашего ответа на комментарий вы хотите проверить, существует ли созданное событие (событие описывает таблицу/информацию базы данных, а не событие С#) без установленного времени окончания. Если это так, его необходимо обновить, указав время окончания. Из-за того, что 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 и выбирая первое).

person dsdel    schedule 19.04.2018
comment
Если сотрудник начинает свою смену, после того, как он нажмет кнопку включения часов, будет создано событие, которое показывает имя пользователя и время начала. Если они заканчивают работу на обед, мне нужно, чтобы проверить, есть ли четное время с этим именем пользователя, у которого нет времени окончания (это означает, что они еще не закончили работу). Если времени окончания нет, мне нужно отредактировать это событие, чтобы добавить время окончания. Скажем, они пришли в 8 утра и собираются уйти на обед. Когда они нажимают кнопку отключения часов, ему нужно проверить, есть ли у этого пользователя событие, которое имеет только время начала, но не время окончания. - person Queen of the North; 19.04.2018
comment
Подумайте о том, чтобы добавить эту дополнительную информацию к своему вопросу, чтобы сделать его более понятным и для других. - person Yunnosch; 19.04.2018
comment
@QueenoftheNorth обновил мой ответ, пожалуйста, проверьте, это ли вы имеете в виду :) - person dsdel; 19.04.2018