Как проверить текущий пароль для изменения пароля в ViewModel с помощью .Net MVC 3? - PullRequest
3 голосов
/ 28 июля 2011

Моя ViewModel:

public class EditViewModel
{
    [Required]
    public string CurrentPassword { get; set; }

    public string NewPassword { get; set; }

    [Compare("NewPassword")]
    public string ConfirmNewPassword { get; set; }
}

Я пытаюсь проверить поле CurrentPassword . Я думал о создании пользовательского атрибута валидатора, который подключается к моей базе данных (для получения текущего пароля) для использования с DataAnnotations.

Есть идея получше?

Обновление:

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

Я не видел лучшего решения, чем создание собственного валидатора для использования с аннотациями данных, как вы думаете?

Ответы [ 3 ]

3 голосов
/ 28 июля 2011

Почему бы просто не позвонить на Membership.ChangePassword?Если это не удается, вы можете добавить ошибку в ModelState:

    [Authorize]
    [HttpPost]
    public ActionResult ChangePassword(ChangePasswordModel model)
    {
        if (ModelState.IsValid)
        {

            // ChangePassword will throw an exception rather
            // than return false in certain failure scenarios.
            bool changePasswordSucceeded;
            try
            {
                MembershipUser currentUser = Membership.GetUser(User.Identity.Name, true /* userIsOnline */);
                changePasswordSucceeded = currentUser.ChangePassword(model.OldPassword, model.NewPassword);
            }
            catch (Exception)
            {
                changePasswordSucceeded = false;
            }

            if (changePasswordSucceeded)
            {
                return RedirectToAction("ChangePasswordSuccess");
            }
            else
            {
                ModelState.AddModelError("", "The current password is incorrect or the new password is invalid.");
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

Кстати, все это делается в шаблоне интернет-проекта по умолчанию.Если вы не хотите проверки на стороне клиента, я не уверен, что цель проверки, чтобы убедиться, что их пароль правильный, а затем вызвать изменение пароля.Это был бы просто дополнительный вызов в базу данных, который кажется ненужным.

2 голосов
/ 28 июля 2011

Вы можете использовать аннотацию [Remote].

Это вызов ajax для метода в определенном контроллере.Там вы можете получить доступ к базе данных или сделать некоторые другие проверки.

[Remote("CheckPassword","YourController", ErrorMessage = "Wrong currentpassword")]
[Required]
public string CurrentPassword { get; set; }


public ActionResult CheckPassword(String Password)
        {
            if (YourRepository.CheckIfPassIsCorrect(Password))
            {
                return Json(false, JsonRequestBehavior.AllowGet);
            }
            else
            {
                return Json(true, JsonRequestBehavior.AllowGet);
            }
        }

Другое решение

Когда вы подчиняетесь своему контроллеру.Сделайте что-то вроде этого:

  if(!YourRepository.CheckIfPassIsCorrect(YourViewModel.CurrentPassword)
    {
    ModelState.AddModelError("CurrentPassword", "Your current password isn't correct");

//Return to your view
    }
0 голосов
/ 29 июля 2011

Мое решение - создание пользовательской проверки для использования с аннотациями данных, вот код:

public class CurrentPasswordAttribute : ValidationAttribute
{
    AuthenticationService authenticationService = new AuthenticationService();

    public override bool IsValid(object value)
    {
        string strValue = value as string;

        if (!string.IsNullOrEmpty(strValue))
        {
            return authenticationService.ValidateUser(HttpContext.Current.User.Identity.Name, strValue);
        }

        return false;
    }

    public override string FormatErrorMessage(string name)
    {
        return String.Format(CultureInfo.CurrentCulture, base.ErrorMessageString, name);
    }
}

А в моей ViewModel:

public class EditViewModel
{
    [CurrentPassword]
    public string CurrentPassword { get; set; }

    public string NewPassword { get; set; }

    [Compare("NewPassword")]
    public string ConfirmNewPassword { get; set; }
}

Спасибо.

...