Asp.net mvc 4 在MVC4中播种数据和创建/管理角色-有多困难?
我快要发疯了,所以我会再次尝试寻求帮助。。。 我正在使用Visual Studio Express 2012 for Web创建一个使用C#+MVC4+Razor+Entity Framework+ASP.NET 4.5的internet项目。 我需要做以下工作:自动创建一个“管理员”用户(谁将在整个网站授权),然后创建一些用户角色。 我在网上读过关于简单记忆、角色和所有的东西,但似乎没有什么能给我一个简单的方法来让整个事情顺利进行 这就是我到目前为止所做的: 1-创建了一个DataContext类:Asp.net mvc 4 在MVC4中播种数据和创建/管理角色-有多困难?,asp.net-mvc-4,visual-studio-2012,simplemembership,Asp.net Mvc 4,Visual Studio 2012,Simplemembership,我快要发疯了,所以我会再次尝试寻求帮助。。。 我正在使用Visual Studio Express 2012 for Web创建一个使用C#+MVC4+Razor+Entity Framework+ASP.NET 4.5的internet项目。 我需要做以下工作:自动创建一个“管理员”用户(谁将在整个网站授权),然后创建一些用户角色。 我在网上读过关于简单记忆、角色和所有的东西,但似乎没有什么能给我一个简单的方法来让整个事情顺利进行 这就是我到目前为止所做的: 1-创建了一个DataContex
public class DataContext : DbContext
{
public DataContext()
: base("DefaultConnection")
{
}
public DbSet<UserProfile> UserProfiles { get; set; }
}
public DbSet<UserProfile> UserProfiles { get; set; }
公共类DataContext:DbContext
{
公共数据上下文()
:base(“默认连接”)
{
}
公共数据库集用户配置文件{get;set;}
}
2-创建了一个初始值设定项类,我假设该类将为我创建管理员用户和管理员角色:
public class DataContextDbInitializer : DropCreateDatabaseAlways<DataContext>
{
protected override void Seed(DataContext context)
{
var roles = (Webmatrix.WebData.SimpleRoleProvider)System.Web.Security.Roles.Provider;
var membership = (Webmatrix.WebData.SimpleMembershipProvider)System.Web.Security.Membership.Provider;
if (!roles.RoleExists("Admins")) {
roles.CreateRole("Admins");
}
if (membership.GetUser("admin", false) == null) {
membership.CreateUserAndAccount("admin", "123456");
}
if (!roles.GetRolesForUser("admin").Contains("Admins")) {
roles.AddUsersToRoles(new[] { "admin" }, new[] { "Admins" });
}
}
}
公共类DataContextDbInitializer:DropCreateDatabaseAlways
{
受保护的覆盖无效种子(DataContext上下文)
{
var roles=(Webmatrix.WebData.SimpleRoleProvider)System.Web.Security.roles.Provider;
var membership=(Webmatrix.WebData.SimpleMembershipProvider)System.Web.Security.membership.Provider;
如果(!roles.RoleExists(“管理员”)){
角色。创建角色(“管理员”);
}
if(membership.GetUser(“admin”,false)==null){
成员资格。CreateUserAndAccount(“管理员”、“123456”);
}
如果(!roles.GetRolesForUser(“admin”)包含(“Admins”)){
roles.AddUsersToRoles(新[]{“admin”},新[]{“Admins”});
}
}
}
(我尝试过从DropCreateDatabaseIfModelChanges继承,但没有帮助)
3-在Global.asax中的App_Start方法中添加了两行:
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
Database.SetInitializer<DataContext>(new DataContextDbInitializer());
WebSecurity.InitializeDatabaseConnection(“DefaultConnection”、“UserProfile”、“UserId”、“UserName”、autoCreateTables:true);
SetInitializer(新的DataContextDbInitializer());
我还尝试在DataContextDbInitializer类的Seed方法中使用WebSecurity.InitializeDatabaseConnection,但没有成功
4-从AccountController中删除了[InitializeSimpleMembership]注释,因此我可以从应用程序生命周期的一开始就对其进行初始化(使用App_Start中的WebSecurity.InitializeDatabaseConnection,如我在第3部分中所述)。我尝试在HomeController中的Index方法的顶部添加[InitializeSimpleMembership],并从App_Start中删除WebSecurity.InitializeDatabaseConnection,但这也没有帮助
5-在Web.config中,我将身份验证方法设置为表单(默认),并保留默认连接字符串:
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-TPFinal-20130121210447;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-TPFinal-20130121210447.mdf" providerName="System.Data.SqlClient" />
</connectionStrings>
并在system.web标记中添加了以下内容:
<roleManager enabled="true" cacheRolesInCookie="true" />
6-然后,为了测试一切是否正常,我在HomeController中的About()方法上使用了[Authorize(Roles=“Admins”)]注释。如果一切正常,这将迫使我以admin/123456身份登录,以便能够看到由HomeController/About控制的“About”页面
7-我没有添加EF迁移或其他任何内容。默认情况下,所有其他内容都是VS2012自动创建的。
因此,我运行我的应用程序并单击“About”链接,然后我看到了登录表单(这意味着[Authorize(Roles=“Admins”)]注释正在执行预期的操作)。我试图以admin/123456身份登录,但每次单击“登录”按钮时,登录页面都会被反复加载
我注意到了几件事:
-如果我在Seed方法中添加一个断点,它似乎不会被调用
-当我使用DropCreateDatabaseAlways并再次运行应用程序时,我能够以admin/123456的身份登录,这让我再次想到我的整个DataContextDbInitializer类甚至都没有被使用,因为我假设DB应该从头创建,这将删除管理员用户
我不知道还能读什么,还能尝试什么。。。我是asp.net的新手(需要我这么说吗?),简直是疯了。
谢谢 试着这样做:
public class DataContextDbInitializer : DropCreateDatabaseAlways<DataContext>
{
protected override void Seed(DataContext context)
{
if (!Roles.RoleExists("Admins"))
{
Roles.CreateRole("Admins");
}
if (!WebSecurity.UserExists("admin"))
{
WebSecurity.CreateUserAndAccount("admin", "123456");
}
if (!Roles.GetRolesForUser("admin").Contains("Admins"))
{
Roles.AddUsersToRoles(new[] { "admin" }, new[] { "Admins" });
}
}
}
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
if (!Roles.RoleExists("Admins"))
{
Roles.CreateRole("Admins");
}
if (!WebSecurity.UserExists("admin"))
{
WebSecurity.CreateUserAndAccount("admin", "123456");
}
if (!Roles.GetRolesForUser("admin").Contains("Admins"))
{
Roles.AddUsersToRoles(new[] { "admin" }, new[] { "Admins" });
}
base.Seed(context);
Database.SetInitializer(new DataContextDbInitializer());
DataContext c = new DataContext();
c.Database.Initialize(true);
最后,我设法使整个事情顺利进行 我的种子方法现在如下所示:
public class DataContextDbInitializer : DropCreateDatabaseAlways<DataContext>
{
protected override void Seed(DataContext context)
{
if (!Roles.RoleExists("Admins"))
{
Roles.CreateRole("Admins");
}
if (!WebSecurity.UserExists("admin"))
{
WebSecurity.CreateUserAndAccount("admin", "123456");
}
if (!Roles.GetRolesForUser("admin").Contains("Admins"))
{
Roles.AddUsersToRoles(new[] { "admin" }, new[] { "Admins" });
}
}
}
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
if (!Roles.RoleExists("Admins"))
{
Roles.CreateRole("Admins");
}
if (!WebSecurity.UserExists("admin"))
{
WebSecurity.CreateUserAndAccount("admin", "123456");
}
if (!Roles.GetRolesForUser("admin").Contains("Admins"))
{
Roles.AddUsersToRoles(new[] { "admin" }, new[] { "Admins" });
}
base.Seed(context);
Database.SetInitializer(new DataContextDbInitializer());
DataContext c = new DataContext();
c.Database.Initialize(true);
我的应用程序在Global.asax中启动如下:
public class DataContextDbInitializer : DropCreateDatabaseAlways<DataContext>
{
protected override void Seed(DataContext context)
{
if (!Roles.RoleExists("Admins"))
{
Roles.CreateRole("Admins");
}
if (!WebSecurity.UserExists("admin"))
{
WebSecurity.CreateUserAndAccount("admin", "123456");
}
if (!Roles.GetRolesForUser("admin").Contains("Admins"))
{
Roles.AddUsersToRoles(new[] { "admin" }, new[] { "Admins" });
}
}
}
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
if (!Roles.RoleExists("Admins"))
{
Roles.CreateRole("Admins");
}
if (!WebSecurity.UserExists("admin"))
{
WebSecurity.CreateUserAndAccount("admin", "123456");
}
if (!Roles.GetRolesForUser("admin").Contains("Admins"))
{
Roles.AddUsersToRoles(new[] { "admin" }, new[] { "Admins" });
}
base.Seed(context);
Database.SetInitializer(new DataContextDbInitializer());
DataContext c = new DataContext();
c.Database.Initialize(true);
我不确定这是否真的在做什么,但我在web.config中的system.web标记中有这个:
<roleManager enabled="true" cacheRolesInCookie="true" />
我还从AccountController中删除了[InitializeSimpleMembership],并在AccountModels中删除了UsersContext类。我将此位移到自己的上下文类:
public class DataContext : DbContext
{
public DataContext()
: base("DefaultConnection")
{
}
public DbSet<UserProfile> UserProfiles { get; set; }
}
public DbSet<UserProfile> UserProfiles { get; set; }
public DbSet UserProfiles{get;set;}
然后,为了测试一切是否正常,我在HomeController中的About()方法上使用了[Authorize(Roles=“Admins”)]注释。如果一切正常,这将迫使我以admin/123456身份登录,以便能够看到由HomeController/About控制的“About”页面。哪个是;)
谢谢你的帮助!这有助于我进一步了解发生的事情。在MVC4中,默认的Internet应用程序内置了身份验证。名为
InitializeSimpleMembershipAttribute
的类位于筛选器目录中。顾名思义,该类初始化简单成员数据库。如果查看构造函数,您将看到以下行:
WebSecurity.InitializeDatabaseConnection("UserContext", "UserProfile", "UserId", "UserName", autoCreateTables: true);
在此行下方,您可以插入以下代码以创建默认用户:
// Create admin user.
if (!WebSecurity.UserExists("admin"))
{
WebSecurity.CreateUserAndAccount("admin", "12345678!");
}
这只是另一种方式。谢谢:)我按照你说的做了,现在我在运行应用程序时以及在它显示主页之前遇到了一个异常(至少是这样!):“System.Web.HttpException。建立与SQL Server的连接时发生与网络相关或特定于实例的错误。找不到服务器或无法访问服务器。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。(提供程序:SQL网络接口,错误:26-定位指定的服务器/实例时出错)“我还没有找到