0

我有一个名为 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"});
            }
        }
    }

当我“注册用户”时,会创建一个客户行,就像 pages_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 表中的所有数据和 pages_Membership 表中的所有数据,现在(如果我在启动时跳过 !roles.RoleExists 代码),我可以登录。
但是,当我尝试单步执行时创建我的超级管理员的角色代码,我仍然得到我上面提到的异常。

4

1 回答 1

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) 确保您使用的是 2.0 版的 Web.Matrix 和 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 之后它开始工作。万岁!我发布这个以防其他一些可怜的毫无戒心的灵魂试图实例化新的提供者......

于 2013-05-19T02:24:52.263 回答