You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 23:36:04