Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 4 在MVC4中播种数据和创建/管理角色-有多困难?_Asp.net Mvc 4_Visual Studio 2012_Simplemembership - Fatal编程技术网

Asp.net mvc 4 在MVC4中播种数据和创建/管理角色-有多困难?

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

我快要发疯了,所以我会再次尝试寻求帮助。。。 我正在使用Visual Studio Express 2012 for Web创建一个使用C#+MVC4+Razor+Entity Framework+ASP.NET 4.5的internet项目。 我需要做以下工作:自动创建一个“管理员”用户(谁将在整个网站授权),然后创建一些用户角色。 我在网上读过关于简单记忆、角色和所有的东西,但似乎没有什么能给我一个简单的方法来让整个事情顺利进行

这就是我到目前为止所做的:

1-创建了一个DataContext类:

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-定位指定的服务器/实例时出错)“我还没有找到