【问题标题】:How authenticate a user using ASP.NET MVC?如何使用 ASP.NET MVC 对用户进行身份验证?
【发布时间】:2014-10-22 01:13:46
【问题描述】:

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

谁有合适的解决方案?或链接到体面的文档以解决此问题?

非常感谢任何帮助!

【问题讨论】:

  • 您的问题是如何将数据从视图发送到控制器或如何检查该用户是否已经在数据库中?
  • 为什么不用asp.net.identity? ?有很多模板和教程可以节省您的时间
  • 实际上之前从未听说过...我只是设法让我的注册/登录成功,但一定会看看 asp.net 身份!
  • 您的控制器似乎缺少else 或删除ModelState.AddModelError() 周围不必要的括号
  • 感谢您提出的答案,但 B2K 已经为我的问题提供了可靠的解决方案!

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


【解决方案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# 以更深入地讨论加盐和散列。请注意,我假设您有一个带有盐值的设置类。您可以将其替换为另一种检索盐的机制。

【讨论】:

  • 很好,非常感谢 B2K!整天都在找那个!
  • 一个棘手的附带问题:我想使用 3 个角色(管理员、用户和编辑),您如何将这些角色分配给这些注册用户?
  • 请对您的密码进行散列和加盐。密码应该永远以纯文本形式存在于您的数据库中!
  • @user3629755 只需为角色的用户添加另一个字段,并将角色存储在用户的会话中。编辑我上面的答案。
  • @mason 所以,你迟到了 6 个月才参加聚会,你唯一的贡献就是否决我的回复?甚至已经有对原始问题的评论建议用户使用更强大的身份验证方案进行调查。在这一点上,我碰巧同意你们三个。我将编辑我的帖子以演示如何使用单向加密方案。请删除反对票。
猜你喜欢
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
  • 2018-03-19
相关资源
最近更新 更多