0

CustomerId と Email を 2 つのフィールド (とりわけ) として持つ Customer という名前のカスタム テーブルがあります。これを 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_Membership テーブルの行と同様に Customer 行が作成され、どちらも見栄えがします。ただし、上記の「var roles」行にブレークポイントを設定し、残りのメソッドをスキップした場合にのみ、ユーザーを登録できます。

次に、このユーザーを作成すると、ログインできません。パスワードが一致しません。

「var roles」で始まるコードをスキップしないと、例外が発生します。「WebSecurity」クラスの他のメソッドを呼び出す前に、「WebSecurity.InitializeDatabaseConnection」メソッドを呼び出す必要があります。

私がそのメソッドを呼び出していることがはっきりとわかるので、これはイライラします。呼び出された後、[ウォッチ] ウィンドウで確認すると、初期化されていることが示されています。

だから、ここで立ち往生しています.... この「シンプル」メンバーシップを使用したいのですが、単純に使用できないようです。

何かご意見は?私はたくさんの記事を読みましたが、すべてを正しく行っているように見えますが、明らかに何かが欠けています...

詳細情報: DBRuWho にマップされる接続文字列は次のとおりです。

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

データが挿入されるので、正しく接続していると確信しています。!roles.RoleExists をチェックすると、例外を乗り越えられないようで、ログインできません。


更新 -- Customer テーブルのすべてのデータと webpages_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 クラスに送信する必要がある他の属性を含めました。これは、他の誰かの利益のための例としてだけです。それらは必ずしも必要ではありません。

とにかく、これを機能させるために 3 つの変更を加えました。

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の後に機能し始めました. 万歳!他の貧しい無防備な魂が新しいプロバイダーをインスタンス化しようとした場合に備えて、これを投稿しています....

于 2013-05-19T02:24:52.263 に答える