mvc 4简单成员要求初始化,即使它是

时间:2013-05-18 02:14:34

标签: asp.net-mvc-4 simplemembership

我有一个名为Customer的自定义表,其中CustomerId和Email为两个字段(以及其他字段)。我想在MVC4网站上使用它 我有一个名为DBRuWho的连接字符串。 在我的App_Start \ AuthConfig.cs文件中,我有一个名为CheckForSuperAdmin()的方法,它将使用初始超级用户为我的表作出种子。

 internal static void CheckForSuperAdmin()
    {
        if (!WebMatrix.WebData.WebSecurity.Initialized)
        {
            WebMatrix.WebData.WebSecurity.InitializeDatabaseConnection("DBRuWho", "customer", "customerId", "email", true);
        }

        var roles = new WebMatrix.WebData.SimpleRoleProvider();
        var users = new WebMatrix.WebData.SimpleMembershipProvider();
        if (!roles.RoleExists("SuperAdmin"))
        {
            roles.CreateRole("SuperAdmin");
            if (users.GetUser("superadmin@superadmin.com", false) == null)
            {
                users.CreateUserAndAccount("superadmin@superadmin.com", "P@ssw0rd53cR3t!");
                roles.AddUsersToRoles(new[] {"superadmin@superadmin.com"}, new[] {"SuperAdmin"});
            }
        }
    }

当我“注册用户”时,将创建一个Customer Row,就像webpages_Membership表中的一行一样,它们看起来都很好。 但是,如果我在上面的“var roles”行设置断点并且跳过方法的其余部分,我只能注册一个用户。

然后,创建此用户后,我无法登录 - 我收到密码不匹配。

如果我没有跳过以“var roles”开头的代码,我得到一个例外: 在调用“WebSecurity”类的任何其他方法之前,必须调用“WebSecurity.InitializeDatabaseConnection”方法。

这令人沮丧,因为你可以清楚地看到我称之为该方法。在调用之后,我在Watch窗口中查看它,并声明它已初始化。

所以,我被困在这里....我想使用这个“简单”的会员资格,但它似乎不允许我简单地使用它!

有什么想法?我看了很多文章,看起来我确实做的一切都很正确,但显然我在这里错过了一些东西......

更多信息:这是我的连接字符串,映射到DBRuWho。

 <connectionStrings>
<add name="DBRuWho" connectionString="Server=localhost;Database=ruwho;integrated security=true" providerName="System.Data.SqlClient" />

我很确定我正确连接,因为数据已插入!当我检查时,我似乎无法超越异常!roles.RoleExists我无法登录。

更新 - 我删除了我的Customer表中的所有数据以及webpages_Membership表中的所有数据,现在(如果我在启动时跳过!roles.RoleExists代码),我可以登录。
但是,当我尝试单步执行角色代码来创建我的超级管理员时,我仍然得到上面提到的异常。

1 个答案:

答案 0 :(得分:1)

终于找到了答案。这是我实现提供者的方式。正确的方法是:

public class Init
{
    const string SUPER_ADMIN_ROLE = "SuperAdmin";

    internal static void CheckForSuperAdmin()
    {
        if (!WebMatrix.WebData.WebSecurity.Initialized)
        {
            WebMatrix.WebData.WebSecurity.InitializeDatabaseConnection("DBRuWho", "customer", "customerId", "email", true);
        }
        var roles = (SimpleRoleProvider)Roles.Provider;
        var users = (SimpleMembershipProvider)Membership.Provider;
        if (!roles.RoleExists(SUPER_ADMIN_ROLE))
        {
            roles.CreateRole(SUPER_ADMIN_ROLE);
            string email = "superadmin@superadmin.com";
            string pswd = "P@ssw0rd!";
            string credentials = API.Helpers.Misc.CreateCompanyCredential(pswd);
            if (users.GetUser(email, false) == null)
            {
                Dictionary<string, object> args = new Dictionary<string, object>()
                {
                    {"Name", email},
                    {"CustomerToken", Guid.NewGuid()},
                    {"Credentials",  credentials},
                    {"isActive",   true}
                };

                users.CreateUserAndAccount(email, pswd, args);
                roles.AddUsersToRoles(new[] { email }, new[] { SUPER_ADMIN_ROLE });
            }
        }
    }
}

我在S / O上发现了一个有点相关的帖子,我很快失去了链接(哎呀!)

我包含了我需要发送到CUSTOMER类的其他属性,这只是为了别人的好处。它们不一定是必需的。

无论如何,我做了三处修改才能让它发挥作用。

1)确保使用的是Web.Matrix 2.0版和Web.Matrix.data

2)我将以下内容添加到我的web.config

<membership defaultProvider="SimpleMembershipProvider">
  <providers>
    <clear />
    <add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" />
  </providers>
</membership>
<roleManager defaultProvider="SimpleRoleProvider" enabled="true">
  <providers>
    <clear />
    <add name="SimpleRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData" />
  </providers>
</roleManager>

3)我在上面列出了代码更改。

我按照这个顺序做了所有这些,然后#3开始工作。万岁!我发布这个以防万一其他可怜的毫无防备的灵魂试图成为新的提供者....