Asp.net mvc ASP.NET MVC-Web安全性是如何工作的?

Asp.net mvc ASP.NET MVC-Web安全性是如何工作的?,asp.net-mvc,security,authentication,Asp.net Mvc,Security,Authentication,我有一个ASP.NETMVC4项目,我已成功连接到MySQL数据库。为此,我添加了一个ADO.NET/EntityFramework类,该类创建了一个Model.edmx对象 在数据库中,我创建了一个名为user的表,它保存了用户表中应该包含的内容,如Email、UserName、Password和FirstName。等等 我创建了一些虚拟记录,并将以下代码添加到AccountController中的Login方法中: [HttpPost] [AllowAnonymous] [ValidateA

我有一个ASP.NETMVC4项目,我已成功连接到MySQL数据库。为此,我添加了一个
ADO.NET/EntityFramework
类,该类创建了一个
Model.edmx
对象

在数据库中,我创建了一个名为
user
的表,它保存了用户表中应该包含的内容,如Email、UserName、Password和FirstName。等等

我创建了一些虚拟记录,并将以下代码添加到
AccountController
中的
Login
方法中:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        var database = new Database();
        user user = database.SelectByUserName(model.UserName).FirstOrDefault<user>();
        var hash = Utilities.HashPassword(model.Password, user.Salt);

        if (hash == user.Password && WebSecurity.Login(user.UserName, user.Password))
        {
            //Correct Login Details!
            RedirectToAction("About", "Home");
        }
    }

    // If we got this far, something failed, redisplay form
    ModelState.AddModelError("", "The user name or password provided is incorrect.");
    return View(model);
}
[HttpPost]
[异名]
[ValidateAntiForgeryToken]
公共操作结果登录(LoginModel模型,字符串返回URL)
{
if(ModelState.IsValid)
{
var database=新数据库();
user=database.SelectByUserName(model.UserName).FirstOrDefault();
var hash=Utilities.HashPassword(model.Password,user.Salt);
if(hash==user.Password&&WebSecurity.Login(user.UserName,user.Password))
{
//正确的登录详细信息!
重定向到动作(“关于”、“家”);
}
}
//如果我们走到这一步,有些东西失败了,重新显示形式
AddModelError(“,”提供的用户名或密码不正确。“);
返回视图(模型);
}
由于某种原因,
WebSecurity.Login
方法返回false,用户不会重定向到主页


为什么返回错误?我遗漏了什么,以及
WebSecurity.Login
如何知道需要什么凭据,即它如何知道应该查看我创建的
user
表中的内容?

您的代码无法工作有两个原因之一。了解WebSecurity和SimpleMembershipProvider(假设您正在使用它)在调用或时用于填充密码字段

因此,要么:

您没有使用这两种方法中的一种来创建用户,在这种情况下,几乎总是会失败(99.99%)


您确实使用了上述方法之一和
实用程序.HashPassword()
中的代码(这似乎是多余的,因为上面列出的创建帐户方法仍然是哈希密码…)不会像WebSecurity那样对密码进行哈希处理
hash==user。密码总是会失败。

WebSecurity不会默认查看数据库,它实际上会使用Web.Config中定义的DefaultConnection创建自己的表。要解决这个问题,您需要添加一个新的连接字符串Web.Config,然后在应用程序初始化期间强制WebSecurity查看该连接

实现这一点的最简单方法是,假设您的Web.Config中有一个名为“AccountConnection”的MySQL特定连接字符串,那么将以下内容添加到您的
应用程序\u Start()

然后需要以下字段和函数:

    private static SimpleMembershipInitializer _initializer;
    private static object _initializerLock = new object();
    private static bool _isInitialized;

    private class SimpleMembershipInitializer
    {
        public SimpleMembershipInitializer()
        {
            Database.SetInitializer<UsersContext>(null);

            try
            {
                using (var context = new UsersContext())
                {
                    if (!context.Database.Exists())
                    {
                        // Create the SimpleMembership database without Entity Framework migration schema
                        ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
                    }
                }
                // Overload is: Web.Config Connection string by name, user table name, user id column name, user name column name, auto create missing tables
                WebSecurity.InitializeDatabaseConnection("AccountConnection", "UserProfile", "UserId", "Email", autoCreateTables: true);
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException("The Membership database could not be initialized.", ex);
            }
        }
    }
私有静态SimpleMembershipInitializer\u initializer;
私有静态对象_initializerLock=新对象();
私有静态布尔值初始化;
私有类SimpleMembershipInitializer
{
公共SimpleMembershipInitializer()
{
Database.SetInitializer(null);
尝试
{
使用(var context=new UsersContext())
{
如果(!context.Database.Exists())
{
//创建没有实体框架迁移模式的SimpleMembership数据库
((IObjectContextAdapter)context.ObjectContext.CreateDatabase();
}
}
//重载为:按名称、用户表名称、用户id列名、用户名列名、自动创建缺少的表的Web.Config连接字符串
WebSecurity.InitializeDatabaseConnection(“AccountConnection”、“UserProfile”、“UserId”、“Email”、autoCreateTables:true);
}
捕获(例外情况除外)
{
抛出新的InvalidOperationException(“无法初始化成员数据库。”,ex);
}
}
}
我不知道你是否能用MySQL实现Web安全,尽管我相信我已经读到了一些支持它的地方


注意:
UserContext
应该在您将WebSecurity安装到解决方案中时自动生成。如果没有,您可以轻松添加CodeFirst模型。

嗨,埃里克+1获取信息。是的,我没有使用任何
WebSecurity.CreateUserAndAccount
/
CreateAccount
方法。我现在可以理解为什么
WebSecurity.Login
会失败。请您指出我需要如何/如何将
WebSecurity.CreateUserAndAccount
方法映射到我的MySQL数据库?Stackoverflow-
    private static SimpleMembershipInitializer _initializer;
    private static object _initializerLock = new object();
    private static bool _isInitialized;

    private class SimpleMembershipInitializer
    {
        public SimpleMembershipInitializer()
        {
            Database.SetInitializer<UsersContext>(null);

            try
            {
                using (var context = new UsersContext())
                {
                    if (!context.Database.Exists())
                    {
                        // Create the SimpleMembership database without Entity Framework migration schema
                        ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
                    }
                }
                // Overload is: Web.Config Connection string by name, user table name, user id column name, user name column name, auto create missing tables
                WebSecurity.InitializeDatabaseConnection("AccountConnection", "UserProfile", "UserId", "Email", autoCreateTables: true);
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException("The Membership database could not be initialized.", ex);
            }
        }
    }