ASP.NET MVC 4のSimpleMembership APIを有効にして、独自のデータベーススキーマと統合したい。データベースには、Users
という名前のプレーンでシンプルなテーブルがあり、次のフィールドがあります。
データベースを使用するようにSimpleMembership APIを構成済みです。
WebSecurity.InitializeDatabaseConnection("MyStuff", "Users", "Id", "Name", autoCreateTables: true);
また、ユーザーを挿入することもできます。
WebSecurity.CreateUserAndAccount(model.UserName, model.Password,
new
{
IsDeleted = false,
Email = "[email protected]"
});
ただし、Passwordフィールド(またはそのハッシュ)はUsersテーブルに挿入されません(もちろん)、InitializeDatabaseConnection
呼び出しで作成され、必要のない多くの不要な情報を含むwebpages_Membership
という別のテーブルに挿入されます。
また、webpages_OAuthMembership、webpages_Roles、webpages_UsersInRolesと呼ばれる他の自動作成されたテーブルは必要ありません。
私はすでにテーブル生成をfalseに設定しようとしました:
WebSecurity.InitializeDatabaseConnection("MyStuff", "Users", "Id", "Name", autoCreateTables: false);
しかし、この場合、CreateUserAndAccount呼び出しはwebpages_Membershipテーブルを見つけられないため、例外をスローします。
SimpleMembership APIを使用する場合、これらのテーブルが必要なようです。
私の質問は、単純なUsers
テーブルだけが必要で、これ以上何もしたくない場合、このようなシナリオで何をすべきかということです。
メンバーシップ全体の処理と認証ロジック(ハッシュコード生成など)を自分で記述する必要がありますか?
製品チームに同じ質問をしました。
SIMPLEメンバーシップの設計目標は、できるだけ簡単に使用できるようにすることでした。
したがって、テーブルに関する限り、実際にはカスタマイズは不可能です。推奨される回避策は、ASP.NETメンバーシップ(SqlMembershipProvider)を引き続き使用することです。
カスタマイズが可能です。
SimpleMembershipProvider のソースコードを CodePlexのaspnetwebstackプロジェクト から取得できます。これは、DBスキーマとランタイム環境の間でマッピングが行われるため、このコードを変更できます。スキーマ、ステートメントなどを必要に応じて変更/置換します(頭痛の種、IMO)。
1-できればEntityFramework 5で移行を有効にする必要があります。NuGetパッケージマネージャーでEnable-Migrations
を使用します。
2-あなたの移動
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "EmailAddress", autoCreateTables: true);
your Seedメソッドに
protected override void Seed(UsersContext context)
{
WebSecurity.InitializeDatabaseConnection(
"DefaultConnection",
"UserProfile",
"UserId",
"UserName", autoCreateTables: true);
if (!Roles.RoleExists("Administrator"))
Roles.CreateRole("Administrator");
if (!WebSecurity.UserExists("lelong37"))
WebSecurity.CreateUserAndAccount(
"lelong37",
"password",
new {Mobile = "+19725000000", IsSmsVerified = false});
if (!Roles.GetRolesForUser("lelong37").Contains("Administrator"))
Roles.AddUsersToRoles(new[] {"lelong37"}, new[] {"Administrator"});
}
EF5がUserProfileテーブルの作成を担当します。そうすると、WebSecurity.InitializeDatabaseConnectionを呼び出して、SimpleMembershipProviderを登録済みのUserProfileテーブルのみに登録し、SimpleMembershipProviderにUserIdとUserNameを通知します。また、ユーザー、ロールを追加して、SeedメソッドとカスタムUserProfileプロパティ/フィールド(ユーザーのモバイル(数値)など)に2つを関連付ける方法の例を示しています。
3-パッケージマネージャーコンソールからupdate-databaseを実行すると、EF5はすべてのカスタムプロパティでテーブルをプロビジョニングします
その他の参照については、ソースコードを使用してこの記事を参照してください:http://blog.longle.io/2012/09/25/seeding-users-and-roles-with- mvc4-simplemembershipprovider-simpleroleprovider-ef5-codefirst-and-custom-user-properties /
これはユースケースでは機能しない場合がありますが、もちろん、別のユーザーテーブルを作成する代わりに、Simplemembership UserProfileテーブルにユーザー属性を非常に簡単に追加できます。
既存のメンバーシップテーブルを使用してハッシュ化されたパスワードを保持し、必要のないフィールドは無視することをお勧めします。これにより、大した手間をかけずにSimpleMembershipとの互換性が維持されます。
SQLMembershipはすぐに使用できます。私はいくつかのプロジェクトでSQLMembershipのカスタマイズされた拡張機能を拡張しましたが、それほど難しくはありませんでした。それは一種のメンテナンスの面倒です、
MembershipProviderを拡張することにより、独自のメンバーシッププロバイダーを作成できます。詳細については、 。NET 4.0のカスタムMembershipProvider を参照してください。このアプローチを使用すると、必要なメソッドを実装するだけで済みます。これにより、物事をよりシンプルに保つことができ、不要なテーブルを追加する必要がなくなります。
基本的な手順(リンクされたSO回答)から取得):
ASP.NETユニバーサルプロバイダーではOAUthを使用できます。ユニバーサルプロバイダーはsqlmembershipプロバイダーの新しいバージョンです。これらはEF CodeFirstに基づいており、データベースのよりクリーンなスキーマを生成します。詳細については投稿 http://blogs.msdn.com/b/pranav_rastogi/archive/2012/09/12/integrate-openauth-openid-with-your-existing-asp-net-application-using- universal-providers.aspx
カスタムユーザーテーブルとSimpleMembershipテーブルの両方を使用できます。この方法は、過去に私にとってはうまく機能しました。
たとえば、AccountControllerのRegisterメソッドで、ユーザーを独自のUsersテーブルに追加して、新しいユーザーを登録します。次に、Usersテーブルに追加したユーザーのIDを使用して、このユーザーをSimpleMembership UserProfileテーブルに追加します。
using (var context = new MyDatabaseEntities())
{
User newUser = new User(){
Name = model.Name,
Email = model.Email,
IsDeleted = false
}
// Add the user to your custom Users table
context.Users.Add(newUser);
context.SaveChanges();
// Add this user to the SimpleMembership table using the same Id as the custom Users table
WebSecurity.CreateUserAndAccount(newUser.Id.ToString(), model.Password);
// Log the user in
WebSecurity.Login(newUser.Id.ToString(), model.Password);
}