我有一个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/