【问题标题】:How to check if password is valid? ASP.NET MVC Membership如何检查密码是否有效? ASP.NET MVC 成员资格
【发布时间】:2012-12-28 03:33:23
【问题描述】:
我使用默认的 asp.net mvc 4 会员系统。用户通过 ASP.NET Web API 以纯文本形式发送他的用户名和密码。
所以我有他的普通密码,如何与存储的哈希密码进行比较?
是否有函数接受一个字符串并将其与散列的字符串进行比较?
【问题讨论】:
标签:
c#
asp.net
asp.net-mvc
asp.net-membership
asp.net-web-api
【解决方案1】:
您必须确保您的 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; }
}
【解决方案2】:
好吧,我有一个类似的请求,我完成的是使用 64 字节字段存储密码,然后生成一个 32 字节盐和 32 字节哈希,然后从数据库中提取盐并使用该盐对相同的用户名进行编码如果结果对象等于 DB 中的对象
这是我使用的方法
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);
}