2015-09-19 2 views
0

У меня есть страница входа, которая берет пароль и совпадает с паролями, хранящимися в базе данных, и эти пароли хранятся в текстовых текстах. В той же таблице у меня есть другой столбец, который имеет все пароли в зашифрованном виде «SHA512». Так что я действительно хочу сделать, это совместить пароль ввода пользователя с зашифрованными паролями и выполнить операцию входа в систему.Входная страница Mvc с использованием структуры linq и сущности

` 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") 
}' 

Это измененный код для согласования с шифрованием столбца

` public ActionResult Login(CustomerCallerList c) 
    { 
     if (ModelState.IsValid) 
     { 
      using (AdcoDBEntities AdcoDB = new AdcoDBEntities()) 
      { 
       var passwordBytes = Encoding.UTF8.GetBytes(c.PasswordSHA); 
       byte[] hashBytes; 
       using (var sha = new SHA512Managed()) 
       { 
        hashBytes = sha.ComputeHash(passwordBytes); 
       } 
       var sb = new StringBuilder(hashBytes.Length * 2); 
       foreach (var b in hashBytes) 
        sb.AppendFormat("{0:x2}", b); 
       var hashStr = sb.ToString(); 
       var v = AdcoDB.CustomerCallerLists.Where(a => a.Name.Equals(c.Name) && a.Password.Equals(hashStr)).FirstOrDefault(); 
       if (v != null) 
       { 
        Session["LoginID"] = v.ID.ToString(); 
        Session["LoginUser"] = v.Name.ToString(); 
        return RedirectToAction("AfterLogin"); 
       } 
      } 
     } 
     return View(c); 
    }` 
+1

Вы не хотите изобретать велосипед, когда речь идет о безопасности. Используйте идентификатор ASP.NET для управления пользователями, проверки подлинности и авторизации. – CodeCaster

ответ

2

Используйте следующий код вычислитель SHA512 хэш пароля:

var passwordBytes = Encoding.UTF8.GetBytes(c.password); 
byte[] hashBytes; 
using (var sha = new SHA512Managed()) { 
    hashBytes = sha.ComputeHash(passwordBytes); 
} 

Если ваш зашифрованный пароль хранится как шестнадцатеричная строка, используйте следующий код для c onvert 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) с чем-то соответствующее.

+0

Спасибо, но это дает мне ошибку: «Ссылка на String не установлена ​​в экземпляр String. Имя параметра: s« –

+0

На какой строке вы видите эту ошибку? – ycsun

+0

var passwordBytes = Encoding.UTF8.GetBytes (c.PasswordSHA); Эта строка –

Смежные вопросы