[英]How authenticate a user using ASP.NET MVC?
我正在使用.net使用用戶登錄名創建一個Web應用程序。 注冊后,用戶的數據將存儲在我的本地SQL數據庫中,並且用戶必須能夠使用這些數據登錄。
目前,我已經設法注冊了用戶,當我使用硬編碼的密碼和用戶名時,他們可以登錄,但是我不知道如何檢查用戶的給定憑據以及數據庫中的憑據以檢查它們是否匹配。
我進行了廣泛的研究,但未找到合適的解決方案,但令人驚訝的是無法提出有效的解決方案。
這是我當前的代碼:
我的用戶模型:
namespace Models
{
public class Users
{
public int Id { get; set; }
public string userName { get; set; }
public string userPassword { get; set; }
public string userEmail { get; set; }
public string userCompany { get; set; }
public class UsersDBContext : DbContext
{
public DbSet<Users> Users { get; set; }
}
}
}
我的控制器
namespace Eindwerk.Controllers
{
public class UsersController : Controller
{
private Users.UsersDBContext db = new Users.UsersDBContext();
// GET: /Users/
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(Users users)
{
if (ModelState.IsValid)
{
if(users.userName == "NAAM" && users.userPassword == "WACHTWOORD")
{
FormsAuthentication.SetAuthCookie(users.userName, false);
return RedirectToAction("", "Home");
}
{
ModelState.AddModelError("", "Invalid username and/or password");
}
}
return View();
}
我的觀點
@model Eindwerk.Models.Users
@{
ViewBag.Title = "Login";
Layout = "../_Login.cshtml";
}
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<div class="panel-body">
<fieldset>
<div class="editor-field">
@Html.TextBoxFor(model => model.userName, new { @class = "form-control", Value="Username"})
@Html.ValidationMessageFor(model => model.userName)
</div>
<br />
<div class="editor-field">
@Html.TextBoxFor(model => model.userPassword, new { @class = "form-control", Value= "Password" })
@Html.ValidationMessageFor(model => model.userPassword)
</div>
<br />
<br />
<p>
<input type="submit" value="SIGN IN" class="btn btn-outline btn-primary btn-lg btn-block"/>
</p>
</fieldset>
</div>
}
因此,我不想使用if(users.userName == "NAAM" && users.userPassword == "WACHTWOORD")
而是要正確檢查用戶是否有效並在我的數據庫中注冊,因此可以授予或拒絕訪問權限。
有人合適的解決方案嗎? 還是鏈接到體面的文檔以解決此問題?
任何幫助都非常感謝!
您需要引用db.Users集合。
[HttpPost]
public ActionResult Index(Users users)
{
if (ModelState.IsValid)
{
var hash = GenerateHash(users.userPassword,Settings.Default.salt);
var authUser = db.Users.FirstOrDefault(row => row.userName == users.userName && row.userPassword == hash )
if ( authUser != null )
{
Session["role"] = authUser.Role;
FormsAuthentication.SetAuthCookie(users.userName, false);
return RedirectToAction("", "Home");
}
else
{
ModelState.AddModelError("", "Invalid username and/or password");
}
}
return View();
}
private static string GenerateHash(string value, string salt)
{
byte[] data = System.Text.Encoding.ASCII.GetBytes(salt + value);
data = System.Security.Cryptography.MD5.Create().ComputeHash(data);
return Convert.ToBase64String(data);
}
請參閱帶有Salt的MD5哈希以在C#中將密碼保存在DB中 ,以獲取關於Salting和哈希的更深入討論。 請注意,我假設您有一個帶有Salt值的Settings類。 您可以用另一種鹽回收機制代替它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.