web-dev-qa-db-ja.com

ASP.NET MVC 4のカスタムデータベーススキーマを使用したSimpleMembership

ASP.NET MVC 4のSimpleMembership APIを有効にして、独自のデータベーススキーマと統合したい。データベースには、Usersという名前のプレーンでシンプルなテーブルがあり、次のフィールドがあります。

  • Id
  • 名前
  • パスワード
  • メール
  • IsDeleted

データベースを使用するように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テーブルだけが必要で、これ以上何もしたくない場合、このようなシナリオで何をすべきかということです。

メンバーシップ全体の処理と認証ロジック(ハッシュコード生成など)を自分で記述する必要がありますか?

37
Zsolt

製品チームに同じ質問をしました。

SIMPLEメンバーシップの設計目標は、できるだけ簡単に使用できるようにすることでした。

したがって、テーブルに関する限り、実際にはカスタマイズは不可能です。推奨される回避策は、ASP.NETメンバーシップ(SqlMembershipProvider)を引き続き使用することです。

11
Max

カスタマイズが可能です。

SimpleMembershipProvider のソースコードを CodePlexのaspnetwebstackプロジェクト から取得できます。これは、DBスキーマとランタイム環境の間でマッピングが行われるため、このコードを変更できます。スキーマ、ステートメントなどを必要に応じて変更/置換します(頭痛の種、IMO)。

10
Shaun Wilson

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 /

3
LeLong37

これはユースケースでは機能しない場合がありますが、もちろん、別のユーザーテーブルを作成する代わりに、Simplemembership UserProfileテーブルにユーザー属性を非常に簡単に追加できます。

既存のメンバーシップテーブルを使用してハッシュ化されたパスワードを保持し、必要のないフィールドは無視することをお勧めします。これにより、大した手間をかけずにSimpleMembershipとの互換性が維持されます。

SQLMembershipはすぐに使用できます。私はいくつかのプロジェクトでSQLMembershipのカスタマイズされた拡張機能を拡張しましたが、それほど難しくはありませんでした。それは一種のメンテナンスの面倒です、

2
Rohit

MembershipProviderを拡張することにより、独自のメンバーシッププロバイダーを作成できます。詳細については、 。NET 4.0のカスタムMembershipProvider を参照してください。このアプローチを使用すると、必要なメソッドを実装するだけで済みます。これにより、物事をよりシンプルに保つことができ、不要なテーブルを追加する必要がなくなります。

基本的な手順(リンクされたSO回答)から取得):

  1. 新しいクラスファイルを作成します(多層システムを使用していない場合、プロジェクトのModelsフォルダーに)MyMembershipProvider.csと呼びましょう
  2. System.Web.Security.MembershipProviderからそのクラスを継承します
  3. 必要なメソッドを自動的に作成します(継承クラスのピリオド+スペース)
2
oalbrecht

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

2
pranav rastogi

カスタムユーザーテーブルと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);
}
0
oalbrecht