基礎となるメンバーシッププロバイダーがなぜ…を決定する必要があるのですか?

StackOverflow https://stackoverflow.com/questions/826661

質問


A) CreateUserWizard コントロールでテンプレートを使用する場合、 ID = Email Textbox を含めるのは、 CreateUserWizardであるかどうかによって異なります。 RequireEmail プロパティはtrueに設定されていますが、 ID = Question TextBox は、基礎となるメンバーシッププロバイダーがパスワードの質問を必要とする場合にのみ必要ですか? 言い換えれば、なぜ Textbox with ID = email )が必要かどうかを決定するのは、基礎となるメンバーシッププロバイダー次第ではないのでしょうか?


B)一方、パスワードの質問が必要かどうかを判断するのは、なぜメンバーシッププロバイダー次第ですか?決定するのはこれがメンバーシップクラスである必要がありますか?結局、メンバーシッププロバイダーの仕事は、基礎となるデータストアへのアクセスを提供することであり、ユーザーが提供する必要のあるデータを決定することではないでしょうか。


thanx


編集:

A)

  

メンバーシッププロバイダーには明白なマッピングが必要であるという事実があります:RequiresQuestionAndAnswerを設定し、これを強制することができますが、ユーザーがメールアドレスを提供する必要があることを指定することはできません。

つまり、RequiresUniqueEmailは本質的に、ユーザーが電子メールアドレスを指定する必要がないことを示していますが、指定する場合は一意でなければなりませんか?


B)

  • メンバーシッププロバイダーを正しく理解している場合、それらはデータストレージにSQLクエリを送信するエンティティですか?!したがって、私は彼らがこのデータストレージが持っているテーブルや関係などの完全な知識を持っていると思いますか?

  • それでも、データストレージにメールアドレスを保存する列がなく、CreateUser()がパラメーターの1つとしてメールアドレスを指定している場合はどうでしょうか。メンバーシッププロバイダーはそれをどのように処理しますか?

役に立ちましたか?

解決

電子メールが予想されるデータフィールドの一部であることは興味深い点です。

明確にしましょう... SQLプロバイダーのRequiresUniqueEmailをtrueに設定すると、厳密に言えば、メールは不要になります。これは、すべてのユーザーが他のユーザーとは異なる電子メールアドレスを使用する必要があることを意味します。そのため、メールアドレスを持たないユーザーが1人いる可能性があります。データベースにヌル値が設定されます。しかし、他のユーザーはその後2人のユーザーに空メールを送信するため、メールアドレスを省略することはできません。したがって、機能的には必要なメールアドレスと同じかもしれませんが、技術的には同じではありません。 / p>

ウィザードコントロールは、メンバーシップ情報を収集するためのデフォルトUIを提供し、使用する際にデフォルトのSQLプロバイダーを使用することを前提としています。既定のプロバイダーを使用していない場合、プロバイダーがすべてのフィールドをサポートしていない場合、またはプロバイダーに他の一意の制約がある場合は、独自のテンプレートを使用してウィザードの手順をカスタマイズし、ウィザードのイベントを処理して独自の検証を提供する必要があります必要に応じて追加のロジック。

メンバーシップシステム自体の理解について...

asp.netのメンバーシップシステムは、厳密なオブジェクト指向設計と利便性の間の妥協案です。基本MembershipProviderクラスには、特定のメンバーシッププロバイダーが継承する、予想外のいくつかの仮定があります。電子メールアドレスは、ベースプロバイダーが行うよりリベラルな仮定の1つで、メンバーシップデータの一部になるという事実。

ただし、ほとんどの環境で当てはまることを前提とすることで、メンバーシップシステムは、メールアドレスに関連する一部の機能をシンプルかつ直感的な方法で公開できます(たとえば、ユーザー名や同じメールアドレスを持つ複数のアカウントを禁止する)。基本クラスがその仮定を行わなかった場合、特定のプロバイダーでメールを処理するたびに、アプリケーション内で使用している特定のタイプへの参照をキャストする必要があります。これは面倒です。

純粋にオブジェクト指向の観点からすると、これらの仮定は不快です。しかし、多くのメンバーシッププロバイダーは、それらを使用しない場合、基本クラスのメソッドとプロパティの空の実装を提供できます。

これは、ロールプロバイダーでさらにわかります。たとえば、Windowsトークンロールプロバイダーには、NotImplmentedExceptionをスローする多くのメンバーがあります(トークンロールプロバイダーはADの読み取り専用プロバイダーであるため、プロパティセットアクセサーはすべてスローします例外)。

他のヒント

メンバーシッププロバイダーに明確なマッピングがあるという事実に帰着します: RequiresQuestionAndAnswer 。これを設定して強制することはできますが、ユーザーがメールアドレスを強制することを指定することはできません。

RequiresUniqueEmail は、「メールが必要」と言うのと同じではありません。 -したがって、CreateUserWizardでは、「電子メールアドレスが一意でなくても構いません」というオプションを提供しています。

質問が必要かどうかをメンバーシッププロバイダーが制御する必要がある理由:プロバイダーがEnablePasswordResetやEnablePasswordRetrievalなども制御しているためです-これらは、メンバーシップクラスであっても、実際にはメンバーシップクラスが認識しないものです" ValidateUser &quot ;メソッド。web.configで指定されたデフォルトのプロバイダーを使用してこれを行います。

  

Membershipクラスは、データソースと通信するためにメンバーシッププロバイダーに依存しています。


質問の編集への応答:

a。 Stephenが指摘しているように、それは正しい空のメールアドレスを持つ1人のユーザーがいて、他のすべてのユーザーは値を持っている必要があります。バリデーターによっては、これは実際に有効なメールアドレスである必要はありません。

b.1。まったく-プロバイダーはユーザーデータストアとの間でデータを送受信します-これはSQLかもしれませんが、Active Directory、LDAP、テキストファイルなどでもかまいませんが、はい、プロバイダーはアプリケーションとアプリケーションの間の分離レイヤーとして機能しますユーザーストア。

b.2。メンバーシップには多くの部分があります-カスタムメンバーシップユーザーの実装カスタムユーザーの作成に必要な手順を実行します-データストレージが電子メールアドレスを処理しない場合(またはプロファイルに複数の電子メールを保存する場合)、プロバイダーは作成時または送信時に送信された値を無視できます更新し、取得時にnullを入力します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top