37

ASP.NET MVC 4 の SimpleMembership API を有効にして、独自のデータベース スキーマと統合したいと考えています。Usersデータベースに、これらのフィールドで呼び出されるプレーンでシンプルなテーブルがあります。

  • ID
  • 名前
  • パスワード
  • Eメール
  • 削除済み

データベースを使用するように SimpleMembership API を既に構成しています。

WebSecurity.InitializeDatabaseConnection("MyStuff", "Users", "Id", "Name", autoCreateTables: true);

また、ユーザーも挿入できます。

WebSecurity.CreateUserAndAccount(model.UserName, model.Password, 
                                 new 
                                 { 
                                        IsDeleted = false, 
                                        Email = "sampledata@gmail.com"                
                                 });

ただし、Passwordフィールド(またはそのハッシュ)はUsersテーブルに挿入されず(もちろん)、呼び出しwebpages_Membershipで作成された別のテーブルに挿入されInitializeDatabaseConnection、必要のない多くの不要な情報が含まれています。

また、必要のない webpages_OAuthMembership、webpages_Roles、webpages_UsersInRoles というテーブルが自動的に作成されました。

私はすでにテーブル生成を false に設定しようとしました:

WebSecurity.InitializeDatabaseConnection("MyStuff", "Users", "Id", "Name", autoCreateTables: false);

ただし、この場合、CreateUserAndAccount 呼び出しは webpages_Membership テーブルを見つけられないため、例外をスローします。

SimpleMembership API を使用するには、これらのテーブルが必要なようです。

Users私の質問は次のとおりです。シンプルなテーブルだけが必要な場合、このようなシナリオではどうすればよいですか?

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

4

7 に答える 7

11

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

SIMPLE メンバーシップの設計目標は、箱から出してできるだけシンプルに作業することでした。

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

于 2012-09-11T07:04:36.967 に答える
10

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

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

于 2013-01-16T18:16:42.227 に答える
3

1 - できれば EntityFramework 5 で移行を有効にする必要があります。NuGetEnable-Migrationsパッケージ マネージャーで使用します。

2 - あなたの

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "EmailAddress", autoCreateTables: true); 

YourMvcApp/Migrations/Configuration.cs クラスの 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 を呼び出して、作成済みの UserProfile テーブルに SimpleMembershipProvider のみを登録し、SimpleMembershipProvider にどの列が UserId と UserName であるかを伝えます。また、ユーザー、ロールを追加し、Seed メソッドで 2 つをカスタム UserProfile プロパティ/フィールド (ユーザーのモバイル (番号) など) に関連付ける方法の例も示しています。

3 - パッケージ マネージャー コンソールから update-database を実行すると、EF5 はすべてのカスタム プロパティを使用してテーブルをプロビジョニングします。

追加の参照については、ソースコードを含むこの記事を参照してください: http://blog.longle.io/2012/09/25/seeding-users-and-roles-with-mvc4-simplemembershipprovider-simpleroleprovider-ef5-codefirst-and-custom -ユーザープロパティ/

于 2012-09-25T01:09:43.987 に答える
2

ASP.NET ユニバーサル プロバイダーで OAUth を使用できます。ユニバーサル プロバイダーは、sqlmembership プロバイダーの新しいバージョンです。これらは EF CodeFirstに基づいており、データベースのよりクリーンなスキーマも生成します。詳細については、次の投稿を参照してください openid-with-your-existing-asp-net-application-using-universal-providers.aspx

于 2012-09-16T20:27:05.823 に答える
2

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

基本的な手順 (リンクされた SO 回答から取得) は次のとおりです。

  1. 新しいクラス ファイルを作成します (多層システムを使用していない場合は、プロジェクトの Models フォルダーにあります)、MyMembershipProvider.cs という名前にしましょう。
  2. そのクラスを System.Web.Security.MembershipProvider から継承します
  3. 必要なメソッドを自動的に作成します (継承クラスのピリオド + スペース)
于 2014-07-16T03:15:43.863 に答える
0

カスタム ユーザー テーブルと 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);
}
于 2014-07-18T02:30:16.587 に答える