如何检查密码是否有效?ASP.NET MVC Membership

3

我正在使用默认的asp.net mvc 4会员系统。 用户以纯文本形式通过ASP.NET Web API发送用户名和密码。

因此,我有他的明文密码,如何将其与存储的哈希密码进行比较?

是否有一个函数可以将字符串与哈希值进行比较?


直接的答案是“是的” [Membership.ValidateUser] http://msdn.microsoft.com/en-us/library/system.web.security.membership.validateuser.aspx - Mark Jones
2个回答

6

您需要确保您的web.config已正确设置以使用成员身份验证。http://msdn.microsoft.com/en-us/library/6e9y4s5t%28v=vs.100%29.aspx

此外,请确保在您的web.config中创建MachineKey。http://msdn.microsoft.com/en-us/library/ff649308.aspx

您要放置在控制器中的代码类似于:

[HttpPost]
public ActionResult Login(AuthenticationModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        if (Membership.ValidateUser(model.Username, model.Password)) {
            FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

            if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
             && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }
    }
}

您的模型类似于:

    public class AuthenticationModel
    {
        [Required]
        [Display(Name = "Username")]
        public string UserName { get; set; }

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

        [Display(Name = "Remember Me?")]
        public bool RememberMe { get; set; }
    }

0

好吧,我有一个类似的请求,我所做的是使用64字节字段存储密码,然后生成32字节的盐和32字节的哈希值,接着从数据库中提取盐并使用该盐对同一用户名进行编码,如果结果对象等于数据库中的对象,则说明匹配成功。

这就是我使用的方法。

    public static bool IsPasswordValid(string plainPassword, byte[] data)
    {
        var prf = KeyDerivationPrf.HMACSHA512;
        var saltBytes = new byte[saltSize];
        var hashBytes = new byte[hashSize];
        Array.Copy(data, 0, saltBytes, 0, saltSize);
        Array.Copy(data, saltSize, hashBytes, 0, hashSize);
        var verificationHashBytes = KeyDerivation.Pbkdf2(plainPassword, saltBytes, prf, iterationCount, hashSize);
        return hashBytes.SequenceEqual(verificationHashBytes);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接