C# 使用linq和实体框架的Mvc登录页面

C# 使用linq和实体框架的Mvc登录页面,c#,asp.net-mvc,entity-framework,linq,C#,Asp.net Mvc,Entity Framework,Linq,我有一个登录页面,它接受密码并与数据库中存储的密码匹配,这些密码存储在平面文本中。在同一个表中,我有另一列,其中所有密码都以加密形式“SHA512”。所以我真正想做的是将用户输入的密码与加密的密码进行匹配,然后进行登录操作 ` public ActionResult Login() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Log

我有一个登录页面,它接受密码并与数据库中存储的密码匹配,这些密码存储在平面文本中。在同一个表中,我有另一列,其中所有密码都以加密形式“SHA512”。所以我真正想做的是将用户输入的密码与加密的密码进行匹配,然后进行登录操作

` public ActionResult Login()
    {
        return View();
    }
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Login(CustomerCallerList c)
    {
        if (ModelState.IsValid)
        {
            using (AdcoDBEntities AdcoDB = new AdcoDBEntities())
            {
                var v = AdcoDB.CustomerCallerLists.Where(a => a.Name.Equals(c.Name) && a.Password.Equals(c.Password)).FirstOrDefault();
                if (v != null)
                {
                    Session["LoginID"] = v.ID.ToString();
                    Session["LoginUser"] = v.Name.ToString();
                    return RedirectToAction("AfterLogin");
                }
            }
        }
        return View(c);
    }`
这是我的控制器,用于将其与平面文本密码匹配

我的看法是这样的

`@model MvcWebSite.Models.CustomerCallerList

 @{
    ViewBag.Title = "Login";
  }

<h2>Login</h2>
@using (Html.BeginForm("Login","Home",FormMethod.Post))
{
  @Html.AntiForgeryToken() //this is for prevent CSRF attack
  @Html.ValidationSummary(true)
  if (@ViewBag.Message != null)
 { 
 <div>
    @ViewBag.Message
 </div>
}
<table>
    <tr>
        <td>@Html.LabelFor(a=>a.Name)</td>
        <td>@Html.TextBoxFor(a=>a.Name)</td>
        <td>@Html.ValidationMessageFor(a=>a.Name)</td>
    </tr>
    <tr>
        <td>@Html.LabelFor(a=>a.Password)</td>
        <td>@Html.TextBoxFor(a=>a.Password)</td>
        <td>@Html.ValidationMessageFor(a=>a.Password)</td>
    </tr>
    <tr>
        <td></td>
        <td>
            <input type="submit" value="Login" />
        </td>
    </tr>
</table>
}
 @section Scripts{
 @Scripts.Render("~/bundles/jqueryval")
 }'

使用以下代码计算密码的SHA512哈希:

var passwordBytes = Encoding.UTF8.GetBytes(c.password);
byte[] hashBytes;
using (var sha = new SHA512Managed()) {
  hashBytes = sha.ComputeHash(passwordBytes);
}
如果加密密码存储为十六进制字符串,请使用以下代码将
hashBytes
转换为字符串:

var sb = new StringBuilder(hashBytes.Length * 2);
foreach (var b in hashBytes)
  sb.AppendFormat("{0:x2}", b);
var hashStr = sb.ToString();

然后,您可以将
hashBytes
hashStr
与您的加密密码列相匹配,方法是将
a.password.Equals(c.password)
替换为适当的内容。

在安全性方面,您不想重新发明轮子。使用ASP.NET标识进行用户管理、身份验证和授权。谢谢,但它给了我一个错误,即“字符串引用未设置为字符串实例。参数名称:s”var passwordBytes=Encoding.UTF8.GetBytes(c.PasswordSHA);这条直线明显地
c.PasswordSHA
null
。也许应该改为
c.Password
?请查看我用您提供的新代码更新的问题,查看我在哪里出错。实际上我是一个自学的学生,所以对MVC不太了解。PasswordSHA是一个列,它以加密的形式包含所有密码。密码包含纯文本。
var sb = new StringBuilder(hashBytes.Length * 2);
foreach (var b in hashBytes)
  sb.AppendFormat("{0:x2}", b);
var hashStr = sb.ToString();