我有一个ASP.NET MVC 4项目,该项目已成功连接到MySQL数据库。我通过添加创建了ADO.NET/EntityFramework对象的Model.edmx类来完成此操作。

在数据库中,我创建了一个名为user的表,该表保存了用户表中应该包含的内容,例如电子邮件,用户名,密码,名字。等等等

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

[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);
}


由于某些原因,WebSecurity.Login方法返回false,并且用户未重定向到主页。

为什么返回假?我缺少什么?WebSecurity.Login怎么会甚至知道所需的凭据,即如何知道它应该在我创建的user表中查找?

最佳答案

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

假设您在Web.Config中有一个名为“ AccountConnection”的特定于MySQL的连接字符串,最简单的方法是在Application_Start()中添加以下内容

LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);


然后,您需要以下字段和功能:

    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);
            }
        }
    }


是否可以使WebSecurity与MySQL一起使用我不知道,尽管我相信我已经阅读了一些受支持的地方。

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

关于asp.net-mvc - ASP.NET MVC-WebSecurity如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20862808/

10-10 22:14