如何检查用户输入的旧密码在 MVC 实体代码优先方法中是否正确?

How to check the old password user entered is correct in MVC Entity Code-First Approach?

我有一个应用程序用户的编辑视图,用户可以从中更改他们的详细信息。该视图包含用户名、电子邮件、旧密码和新密码。因为,用户输入旧密码我想用ajax检查数据库用户是否输入了正确的旧密码?如果旧密码正确,那么我将启用新密码,否则我需要向用户显示密码不正确的消息。我怎样才能做到这一点?有什么远程方法可以做到吗?

查看模型

    [DataType(DataType.Password)]
    [Display(Name = "Old password")]
    public string OldPassword { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "New password")]
    public string NewPassword { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    public string NewPasswordCompare { get; set; }

Ajax代码

<script>
    $(document).ready(function () {
        $("#Verify").click(function () {
            var oldPassword = $('#Password').val();
            $.ajax({
                type: "GET",
                url: "@Url.Action("GetPassword")",
                data: {'id':@Model.Id, 'password': oldPassword},
                datatype: "JSON",
                success: function (data) {
                    if (data) {
                        console.log("Working");
                    }
                }
            });
        });
    });
</script>

控制器

public JsonResult GetPassword(string id, string password)
        {
            using (var db = new ApplicationDbContext())
            {
                var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(db));
                var user = UserManager.FindById(id);
                if (UserManager.CheckPassword(user, password))
                {
                    return Json(true, JsonRequestBehavior.AllowGet);
                }
                else
                {
                    return Json(false, JsonRequestBehavior.AllowGet);
                }
            }

Ajax 请求无效。

您必须先对收到的密码进行哈希处理,然后再进行比较。

var UserManager = new UserManager<User>(new UserStore<User>(new ApplicationDbContext()));

String hashedOldPassword = UserManager.PasswordHasher.HashPassword(password);
ApplicationDbContext db = new ApplicationDbContext();
var result = db.Users.Where(u => u.Id == id && u.PasswordHash == hashedOldPassword).First();

会成功的。

使用这个:

        using (var db = new ApplicationDbContext())
        {
            var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(db));
            var user = UserManager.FindById(id);
            if (UserManager.CheckPassword(user, password))
            {
                return Json(true, JsonRequestBehavior.AllowGet);
            }
            else
            {
                return Json(false, JsonRequestBehavior.AllowGet);
            }
        }