C# 使用linq和实体框架的Mvc登录页面
我有一个登录页面,它接受密码并与数据库中存储的密码匹配,这些密码存储在平面文本中。在同一个表中,我有另一列,其中所有密码都以加密形式“SHA512”。所以我真正想做的是将用户输入的密码与加密的密码进行匹配,然后进行登录操作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
` 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();