ASP.NET MVC中实现密码哈希加密并存入SQL Server数据库的问题求助
ASP.NET MVC 密码哈希存储实现方案
修改步骤
1. 调整Login实体模型
给ConfirmPassword字段添加[NotMapped]属性,避免EF将其映射到数据库表字段,同时确认数据库中Password字段的类型为nvarchar(128),确保足够存储哈希后的字符串。
修改后的Login.cs代码:
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; public class Login { public int ID { get; set; } [Required(ErrorMessage = "Please Enter Your Name")] public string FirstName { get; set; } [Required(ErrorMessage = "Please Enter Your Surname")] public string LastName { get; set; } [Required(ErrorMessage = "Please Enter Email")] public string Email { get; set; } [Required(ErrorMessage = "Please Enter Password")] public string Password { get; set; } [NotMapped] [Required(ErrorMessage = "Please Confirm Password")] [Compare("Password")] public string ConfirmPassword { get; set; } }
2. 修改注册逻辑,存储哈希密码
在LoginController的Register Post方法中新增密码哈希逻辑,将用户输入的明文密码哈希后再存入数据库,使用ASP.NET自带的Crypto.HashPassword方法(自动生成随机盐拼接哈希值,安全性更高),需要引用命名空间System.Web.Helpers。
修改后的Register方法代码:
[HttpPost] [ValidateAntiForgeryToken] public ActionResult Register([Bind(Include = "ID,FirstName,LastName,Email,Password,ConfirmPassword")] Login login) { if (ModelState.IsValid) { // 哈希处理明文密码 login.Password = Crypto.HashPassword(login.Password); db.Logins.Add(login); db.SaveChanges(); return RedirectToAction("Index"); } return View(login); }
3. 修改登录逻辑,校验哈希密码
登录时不要直接比对明文密码,先根据邮箱查询对应用户,再使用Crypto.VerifyHashedPassword方法校验用户输入的密码和数据库存储的哈希值是否匹配。
修改后的登录Post方法代码:
[HttpPost] [ValidateAntiForgeryToken] public ActionResult Index(Login logins) { if (ModelState.IsValid) { // 先根据邮箱查询用户记录 var obj = db.Logins.FirstOrDefault(a => a.Email.Equals(logins.Email)); if (obj != null && Crypto.VerifyHashedPassword(obj.Password, logins.Password)) { Session["UserID"] = obj.ID.ToString(); Session["UserName"] = obj.FirstName.ToString(); Session["UserSurname"] = obj.LastName.ToString(); return RedirectToAction("UserDashBoard"); } // 校验失败添加错误提示 ModelState.AddModelError("", "邮箱或密码错误"); } return View(logins); }
注意事项
- 如果项目中找不到
Crypto类,可通过NuGet安装Microsoft.AspNet.WebPages包。 - 之前已存储的明文密码用户需要重新设置密码,否则无法通过哈希校验登录。
内容的提问来源于stack exchange,提问作者Vedo
相关产品推荐
相关产品推荐

