エンティティフレームワークの移行を使用して、ユーザーテーブルにユーザーアカウントを作成するにはどうすればよいですか?
-
27-10-2019 - |
質問
以前は、最初にコードを使用してテーブルを作成するときに、データベース初期イザーを使用してテーブルをシードまたは事前に入力しました。これはすべてうまくいきましたが、EF 4.3の移行を使用して進みたいと思いました。
プロジェクトでEF 4.3に更新し、データベース初期化コードを削除し、移行configuration.csファイルのシードメソッド内に配置しました。これはすべて、デフォルトのユーザーをユーザーテーブルにシードしたい場合を除き、テーブルを事前に設定するために私にとっては問題ありません。
シード方法内で次のコードを使用します。(現在、これはこの状況にそれを使用する方法がわからないため、AddorUpDateコードを使用していません - したがって、ユーザー名チェック)
// create default User
MembershipCreateStatus status = new MembershipCreateStatus();
User admin = context.Users.Find("TestGuy");
if (admin == null)
{
Membership.CreateUser("TestGuy", "TestGuy123", "testguy@test.com");
if (status == MembershipCreateStatus.Success)
{
admin.Firstname = "Test";
admin.Surname = "Guy";
admin.DateLastActivity = DateTime.Now;
admin.LastActivityRoute = "/Home/Index";
Role adminRole = context.Roles.Find("Administrator");
admin.Roles = new List<Role>();
admin.Roles.Add(adminRole);
}
}
Update-Databaseを実行しようとすると、このエラーが発生します。
The password-answer supplied is invalid.
これはCreateUserと呼ばれる方法にちょうどあると思いますが、このバグを回避する方法を理解できないようです。私はセキュリティの質問と回答のためにヌルだけを入れようとしましたが、それはうまくいかないようです。
「addorupdate」オプションを使用してユーザーをシードする例はありますか?
編集1:
以下のコメントの1つによると、私はAltairisセキュリティツールキットを使用してメンバーシップを管理しています。私のweb.configは次のようにセットアップされています。
<membership defaultProvider="TableMembershipProvider">
<providers>
<clear />
<add name="TableMembershipProvider" type="Altairis.Web.Security.TableMembershipProvider, Altairis.Web.Security" connectionStringName="DataContext" minRequiredPasswordLength="8" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" minRequiredNonAlphanumericCharacters="0" passwordStrengthRegularExpression="" />
</providers>
</membership>
編集2:
また、これをAltairisフォーラムのオープンチケットとして掲載しました。http://altairiswebsecurity.codeplex.com/workitem/32273
編集3:
エラーなしでこれを機能させるには、次のようにコードをセットアップする必要がありました。
// create default User
MembershipCreateStatus status = new MembershipCreateStatus();
User admin = context.Users.Find("TestGuy");
if (admin == null)
{
Membership.CreateUser("TestGuy", "TestGuy123", "testguy@test.com", null, null, true, out status);
if (status == MembershipCreateStatus.Success)
{
admin = context.Users.Find("TestGuy");
admin.Firstname = "Test";
admin.Surname = "Guy";
admin.DateLastActivity = DateTime.Now;
admin.LastActivityRoute = "/Home/Index";
Role adminRole = context.Roles.Find("Administrator");
admin.Roles = new List<Role>();
admin.Roles.Add(adminRole);
}
}
Update-Databaseを実行するときに上記はコンパイルされますが、新しいユーザーは生成されません。誰かが試してみるための提案を持っているなら、それは素晴らしいことです!
ありがとう、
リッチ
解決 2
この問題に関するいくつかの調査を行うことから、ユーザーのシードは移行の外側に作成されるべきであることが明らかになります - 少なくとも今のところ、彼らがより簡単になるまで!
回避策として、私はこのstackoverflowの質問の例に従いました(エンティティフレームワーク4.3でデータを増分する最良の方法)移行構成ファイルの外側の起動時に新しいユーザーを手動で作成する。
少なくとも私にとっては理想的ではありません。すべての「スタートアップ」データは1つの領域にないので、仕事を終わらせ、従うのはそれほど難しいことではありません。
他のヒント
あなたのメンバーシップは質問と回答が必要になるように設定されていると思います。 「if(membership.requiresquestionandanswer)」を使用してチェックインを試してみましたか?
管理者へ:ちなみに、私はこれを最初にコメントとして投稿したかったので、最後に回答を使用するときにフラグが付けられましたが、コメントを追加するためのオプションはここにありません。