62

MSDN の記事や SO の投稿など、このトピックに関するすべての記事を読みましたが、まだ非常に迷っており、混乱しています。

質問

次の質問に答えてください (できれば簡潔に)。

  1. SimpleMembership/SimpleMembershipProvider ( WebMatrix.WebData ) とは何ですか?また、その責任は何ですか?

  2. WebSecurity ( WebMatrix.WebData )とは?

  3. メンバーシップ( System.Web.Security ) クラスとは何ですか?

  4. MVC4 がUserProfileテーブルとwebpages_Membershipテーブルを作成するのはなぜですか? それらは何のためにあり、違いは何ですか?MVC4 が作成する UserProfile クラスとは何ですか?

  5. UsersContextクラスとは何ですか?

  6. これらすべてがどのように連携してユーザー認証を行うのでしょうか?

私の状況

これらの質問は、次の問題につながります。

ユーザー (ID、ユーザー名、パスワード) を含む既存のデータベースがあるとします。新しい MVC4 アプリケーションを作成し、フォーム認証を使用しています。ユーザーのパスワードは、暗号化された形式 (bcrypt ではない) でデータベースに保存されます。

MVC4 で動作させるにはどうすればよいですか?

カスタムMembershipProviderを作成する必要がありますか?

これまでの私の知識

私が理解できる限り、WebSecurityはMembershipProviderと対話する静的クラス (モジュール) です。MembershipProvider は、 ValidateUserCreateUserChangePasswordなどの特定の機能がどのように機能するかを説明するクラスです。

私の問題を解決するには、カスタム MembershipProvider を作成し、WebSecurity に新しい MembershipProvider を使用するように指示する必要があると思います。

バウンティ?

私はこの質問に報奨金を出しており、優れた回答に対して Andy Brown に賞を与えるつもりです。

4

1 に答える 1

188

簡単な回答については、各引用の下の要約を参照してください。詳細については、段落を参照してください。信頼できる情報源については、末尾の「参考文献」セクションも参照してください。

要約

1.SimpleMembership/SimpleMembershipProvider (WebMatrix.WebData) とは何ですか? また、その責任は何ですか?

SimpleMembership ( と の両方を含む用語SimpleMembershipProvider)SimpleRoleProviderは、誰もが使用できる安全なパスワード ストレージを備えた 80% のプラグ アンド プレイ認証および承認フレームワークを実装するクリーンで迅速な方法を提供する責任があります。

2.WebSecurity(WebMatrix.WebData)とは?

WebSecurityMembershipは、およびと一緒に機能する一般的なメンバーシップ タスクのヘルパー クラスですOAuthWebSecurity。ロールは、引き続き を通じて個別にアクセスされますRoles

3.Membership (System.Web.Security) クラスとは何ですか?

Membershipユーザー設定と操作を管理する元の ASP.NET メンバーシップ実装の静的クラスです。多くのユーザー操作は、 で繰り返すのではなく、ここで実行されますWebSecurity。どちらも、選択した同じプロバイダーを使用します。

4.MVC4 が UserProfile テーブルと webpages_Membership テーブルを作成するのはなぜですか? それらは何のためにあり、違いは何ですか?MVC4 が作成する UserProfile クラスとは何ですか?

2 つのテーブルは、異なる機能を実行します。webpages_Membershipスキーマはフレームワークによって制御され、資格情報に使用されます。スキーマUserProfileは私たちによって制御され、ユーザーに対して保存するプロパティに使用されます。

5.UsersContext クラスとは何ですか?

これは、MVC インターネット アプリケーション テンプレートによって開始として提供される( DbContext APIDbContextの一部) です。その唯一の役割は、(たとえば を介して) クラスを操作できるようにクラスを含めることです。UserProfileInitializeSimpleMembershipAttribute

6.これらすべてがどのように連携してユーザー認証を行うのですか?

これは、上記の要約と以下の詳細から明らかなはずです。用途:WebSecurity一般的なタスク。(Visual Studio の「MVC インターネット アプリケーション」テンプレート内)UserProfileを介してアクセスされる、ユーザーに対して保存するカスタム プロパティ。メソッドを持っていない場合。そして役割のために。VS テンプレートのコントローラーを使用して、使用例を確認します。UsersContextMembershipWebSecurityOAuthWebSecurityRoles

編集します。もし誰かがここまで来たら

既存のデータベースがあるとします...

既存のデータベースがあり、カスタム メンバーシップ プロバイダーを作成する唯一の理由が従来のパスワード ストレージ メソッドに対処することである場合は、回避策を使用できます。これは、古いパスワード ストレージから SimpleMembership アルゴリズム (Rfc2898DeriveBytesクラスを使用する) に移行できる場合にのみ機能します。詳細については、脚注を参照してください。

離れられない場合は、特定のパスワード アルゴリズムを使用するために独自のプロバイダーを作成する必要がありますSimpleMembershipProvider

注:パスワードSimpleMembershipProviderENCRYPT ではなくハッシュされます。違いとそれが重要な理由がわからない場合は、カスタム セキュリティを使用して独自のプロバイダーを作成する前によく考えてください。


詳細

1.SimpleMembership/SimpleMembershipProviderとは

すべてがどのように組み合わされているかを理解するには、歴史を理解することが役立ちます。

  • ASP.NET は 2005 年に ASP.NET メンバーシップ システムを導入しました。
  • このシステムはプロバイダーを使用して、アカウントやロールなどの管理に使用される共通のインターフェイスから実装の詳細を抽象化しました。
  • また、基本的な「ユーザー プロファイル」機能も提供されました (単一列の xml フィールドに保存されるため、人々は避けがちでした)。
  • SimpleMembership は、ASP.NET メンバーシップ システムにプラグインするプロバイダーとして 2010 年に世界にリリースされましたが、OAuth 認証、および列ごとのプロパティ ユーザー プロファイル ストレージ (オリジナルで使用されていた単一列ストレージの代わりに) も可能にします。実装)。
  • SimpleMembershipProvider元のプロバイダの実装ExtendedMembershipProviderを拡張する実装

これは、codeplex のオープン ソースです ( github にミラーリングされています)。したがって、セキュリティに関する限り、コードを自分で評価し、複製し、変更することができます。オープンソース セキュリティ利点と欠点について独自の見解を持ち、 NIHのピンチでそれを調理する必要があります。(個人的な見解: 時々使用しますが、それ以外は使用しません)

ExtendedMembershipProviderGeneratePasswordResetTokenそれ自体は、古いメンバーシップ プロバイダー API のようなコマンドを追加します。

2.WebSecurity(WebMatrix.WebData)とは?

WebSecurity簡単なアクセスを提供しSimpleMembershipProvider、一般的なタスクを 1 か所で簡単にアクセスできるようにするための単なるファサードまたはヘルパー クラスです。これは、元のフレームワークの拡張により、ExtendedMembershipProvider元のクラスの一部がMembership現在では十分ではないことを意味するためです。例:

  • WebSecurity.CurrentUserName- 現在ログインしているユーザーの名前を取得します
  • WebSecurity.CreateUserAndAccount. ユーザーの作成とユーザー プロファイル プロパティの設定を同時に行います (例:WebSecurity.CreateUserAndAccount(userName, pw, new { Email = model.Email });
  • WebSecurity.InitializeDatabaseConnection- メンバーシップで使用する新しい/既存のデータベースをすばやくセットアップし、ユーザー ID 列とユーザー自然キー識別子などを選択します。
  • ResetPasswordユーザーパスワードのリセットGeneratePasswordResetTokenなど

これらのメソッドは一般に、使用しているプロバイダに従います。SimpleMembership に依存するだけでなく、プロバイダのようなオブジェクトを結び付けて、Membershipメンバーシップ関数を実行するための共通点を提供します。

OAuth 認証OAuthWebSecurityに相当するものもあることに注意してください。WebSecurity

3.Membership (System.Web.Security) クラスとは何ですか?

Membership元の実装からのものです。ユーザー設定を管理し、現在拡張されている基本的なMembershipProvider実装を使用してユーザー関連の操作を実行します。ExtendedMembershipProviderこれは静的クラスであるため、名前空間を宣言する場所ならどこでも使用できるため、たとえば現在のユーザーを簡単に取得できます。Membership.GetUser

WebSecurityあることを行って他のことを行わなかったり、あることを行って他のことを行わなかったりするという事実によって引き起こされる混乱がありMembershipます。WebSecurityより高いレベルの操作のためのツールキット、およびMembershipユーザーに対して何かを行うためのツールキットと見なす場合は、問題ありません。それらはプロバイダー上で連携します。

4.MVC4 が UserProfile テーブルと webpages_Membership テーブルを作成するのはなぜですか? それらは何のためにあり、違いは何ですか?MVC4 が作成する UserProfile クラスとは何ですか?

  • webpages_Membershipは、固定スキーマを持つテーブルであり、プロバイダーは基本的なアカウント操作を実行でき、主に資格情報を保存できます。
  • UserProfileは、ユーザー アカウントに対する情報を格納するためにカスタマイズするテーブルであり、UserProfileクラスを通じて厳密に型指定された形式で利用できるようにします。
  • webpages_OAuthMembershipと同じジョブを実行する と呼ばれる追加のテーブルがありますが、webpages_Membership統合する OAuth ログイン プロバイダ用です。

このセットアップの魔法は、1 人のユーザーが自分のサイトでメンバーシップ ログインを持ち、Google、Facebook などのさまざまなプロバイダーで任意の数の OAuth ログインを持つことができ、それらはすべて、に保存されている共通のプロファイルを共有することです。UserProfile

通常、テーブルが で始まる場合、webpages_アクセスするための API があることを意味します。テーブルは、(デフォルトの MVC インターネット アプリケーション テンプレートを使用する場合)のクラスUserProfileによって表されます。したがって、に含まれる任意のクラスで使用する通常のメソッドを介してこれにアクセスします。UserProfileUsersContextDbContext

UserProfileはコード ファーストに非常に適しています。列 (ユーザーのEmailアドレスなど) を追加してから、移行を設定して、次のリリースでその列をデータベースに含めることができます (移行を使用したい場合)。実際、UserProfileテーブルはそのように呼ばれる必要はありません -WebSecurity.InitializeDatabaseConnection呼び出し、[Table("UserProfile")] public class UserProfileおよび独自の移行を使用して変更できます。

5.UsersContext クラスとは何ですか?

これは、Visual Studio の新しいプロジェクトで提供されている MVC インターネット アプリケーション テンプレートからのものです。最初に、自分のデータベース コンテキストと共通の接続文字列を共有していることを確認します (メンバーシップ テーブルが同じデータベースにあると仮定します)。必要に応じて、これを変更して後で分離することができます。

独自のコンテキストとは別のものにする必要はありません。これは、メンバーシップ情報を現在または将来別のデータベースに保存する場合にのみ必要です。それを取り除く場合は、参照をUsersContext独自のコンテキストに変更するだけです。 、調整中Database.SetInitializer

参考文献:

Using SimpleMembership With ASP.NET WebPages - Matthew Osborn - これは、SimpleMembership とその内容、理由、機能に関する元のリファレンスです。

MSDN - メンバーシップの紹介 - メンバーシップは依然として SimpleMembership の中核であるため、それについて少し理解するのに役立ちます。


編集脚注: ローリング パスワード アップグレードの詳細

  • アカウントのパスワード バージョンを格納するプロパティを追加しますUserProfile(例: レガシーの場合は 1、SimpleMembership の場合は 2)。
  • 「ログイン」アクションで、次のようにコードを記述します。
    • それらがSimpleMembershipパスワードバージョンにある場合は、通常のログインを行います
    • レガシー パスワード バージョンを使用している場合は、次のことを行います。
      • 古い方法で確認してください
      • それが正しい場合は、SimpleMembership バージョンを使用するためにResetPasswordそれChangePasswordを使用してリセットすると、フィールドが新しいパスワード バージョンに更新されます。
      • 最後に、パスワードのバージョンを更新しますUserProfile
  • 同様の方法でパスワードを使用する他の A​​ccountsController メソッドを更新します。
  • 新しいカスタム プロバイダーを作成する必要がないため、ハックな回避策と、webpages_Membership触れてはならないテーブルへの結合を使用してください。

このすべてを でトランザクション対応にすることができTransactionScopeます。起こっている唯一の厄介なことは、コントローラーの余分なコードと への結合webpages_Membershipです。

于 2013-05-24T12:10:15.417 に答える