如何使用ASP.NET MVC对用户进行身份验证?

时间:2014-05-12 19:08:30

标签: c# asp.net-mvc razor login

我正在使用.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") 我想正确检查用户是否有效并在我的数据库中注册,以便我可以授予或拒绝访问权限。

任何人都有合适的解决方案吗?或者链接到体面的文档以解决这个问题?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

您需要引用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);
}

有关盐析和散列的更深入讨论,请参阅MD5 hash with salt for keeping password in DB in C#。请注意,我假设您有一个带有salt值的Settings类。您可以将其替换为另一种检索盐的机制。