Asp.net mvc 4 MVC4简单成员身份要求初始化,即使是

Asp.net mvc 4 MVC4简单成员身份要求初始化,即使是,asp.net-mvc-4,simplemembership,Asp.net Mvc 4,Simplemembership,我有一个名为Customer的自定义表,其中CustomerId和Email作为两个字段(除其他字段外)。我想在MVC4站点中使用它。 我有一个名为DBRuWho的连接字符串。 在我的App_Start\AuthConfig.cs文件中,我有一个名为CheckForSuperAdmin()的方法,该方法将使用初始超级用户为我的表种子 internal static void CheckForSuperAdmin() { if (!WebMatrix.WebData.We

我有一个名为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"});
            }
        }
    }
当我“注册一个用户”时,会创建一个客户行,就像在webpages\u成员表中创建一行一样,它们看起来都很好。 但是,只有在上面的“var角色”行设置断点并跳过方法的其余部分时,我才能注册用户

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

如果我不跳过以“var roles”开头的代码,我会得到一个异常: 在调用“WebSecurity”类的任何其他方法之前,必须先调用“WebSecurity.InitializeDatabaseConnection”方法

这是令人沮丧的,因为您可以清楚地看到,我确实调用了该方法。在它被调用之后,我在我的手表窗口中查看它,它声明它已初始化

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

有什么想法吗?我读了很多文章,看起来我做的每件事都是正确的,但很明显我在这里遗漏了一些东西

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

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

我很确定我连接正确,因为数据被插入了!当我检查时,我似乎无法通过异常!roles.RoleExists,我无法登录

更新--我删除了我的客户表中的所有数据和webpages_Membership表中的所有数据,现在(如果我在启动时跳过!roles.RoleExists代码),我可以登录了。

然而,当我尝试逐步通过角色代码来创建我的超级管理员时,我仍然得到了上面提到的异常。

最终找到了答案。这是我在举例说明提供者的方式。正确的工作方式是:

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 });
            }
        }
    }
}
公共类初始化
{
常量字符串SUPER\u ADMIN\u ROLE=“SuperAdmin”;
内部静态void CheckForSuperAdmin()
{
如果(!WebMatrix.WebData.WebSecurity.Initialized)
{
WebMatrix.WebData.WebSecurity.InitializeDatabaseConnection(“DBRuWho”、“customer”、“customerId”、“email”,true);
}
var roles=(SimpleRoleProvider)roles.Provider;
var users=(SimpleMembershipProvider)Membership.Provider;
如果(!roles.RoleExists(超级管理员角色))
{
创建角色(超级管理员角色);
字符串电子邮件=”superadmin@superadmin.com";
字符串pswd=”P@ssw0rd!";
字符串凭据=API.Helpers.Misc.CreateCompanyCredential(pswd);
if(users.GetUser(email,false)==null)
{
字典args=新字典()
{
{“姓名”,电子邮件},
{“CustomerToken”,Guid.NewGuid()},
{“凭证”,凭证},
{“isActive”,真的}
};
users.CreateUserAndAccount(电子邮件、pswd、args);
roles.AddUsersToRoles(新[]{email},新[]{SUPER_ADMIN_ROLE});
}
}
}
}
我在S/O上的一篇相关文章中发现了这一点,我很快就失去了链接(哎呀!)

我还包括了我需要发送到我的CUSTOMER类的其他属性,这只是为了给其他人带来好处的一个例子。它们不一定是必需的

无论如何,我做了三个改变来让它工作

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

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天后它开始工作。好极了我发布这篇文章是为了防止其他可怜的、毫无戒心的人尝试引用新的提供者……

网络安全。InitializeDatabaseConnection
仍然在
InitializeSimpleMembershipAttribute.cs中被调用。我注释掉了该属性,所以上面的代码是它被调用的唯一地方。