在我的项目中,我使用WebSecurity和EF代码优先迁移。WebSecurity.InitializeDatabaseConnection不配合代码优先迁移
我有我的自定义UserProfile类我想与WebSecurity结合。
我想要种子用户在Seed方法的迁移配置类中。
所以我试试这个:
#1)
if (!Roles.RoleExists("admin"))
Roles.CreateRole("admin");
if (!WebSecurity.UserExists(AdminUserName))
WebSecurity.CreateUserAndAccount(
AdminUserName,
"admin",
new {Email = "[email protected]"});
但抱怨说我应该先打电话WebSecurity.InitializeDatabaseConnection。
好的,这是有道理的。所以我添加以下行到我的Global.asax:
#2)
WebSecurity.InitializeDatabaseConnection(
_connectionStringName,
"UserProfiles",
"Id",
"UserName",
autoCreateTables: true);
但比下面几行:
#3)
var dbMigrator = new DbMigrator(_configuration);
dbMigrator.Update();
抛出错误:
There is already an object named 'UserProfiles' in the database.
那么,这又是有道理的迁移尝试创建刚刚由WebSecurity创建的表。
我发现了一个解决方法:我把#2)放在#1的右上方)。比它的工作。
- 迁移创建的UserProfiles表
- WebSecurity连接到现有的UserProfiles表,创建它需要
- 种子工程,因为他们发现所需的表及WebSecurity被初始化其他表。
问题是我必须初始化种子方法内的WebSecurity,这是有点臭。
我的问题是如何将WebSecurity.InitializeDatabaseConnection移回Global.asax?
您的网站应该在有限的操作系统和运行大tabase特权。如果没有,那么黑客有可能使用漏洞修改存储过程,触发器等。因此,数据库迁移(操作数据库的模式)应该可以在Web应用程序进程之外使用特权帐户完成。我知道它并不总是可能的(又名托管解决方案),但是要牢记这些风险。 – bloudraak