SimpleMembership セットアップでは、ローカルおよび複数の OAuth ログインがすべて同じものを共有UserProfile
できるため、1 人のユーザーがローカル パスワードまたは FacebOogLiveWitter でログインできます。
(この回答では、OAuth プロバイダーがローカル アカウントの一致する情報を返送しないと仮定していることを述べておく必要があります。もしそうなら、実際にマージを実行する原則は同じですが、複雑さと歩数が大幅に減ります。)
OAuth 登録プロセスは、2 つのアカウントをマージしようとするのではなく、既存のユーザー名を使用する場合、ユーザーを拒否します。したがって、これは単純ではありません。機能を自分で構築する必要があります。ユーザーがこれにアプローチできる方向が多数あるため、プロセスは複雑です (したがって、1 つまたは 2 つのみをサポートすることで簡素化できます)。また、誰かが所有していないアカウントにマージしようとした場合に備えて、セキュリティを強化する必要があります。 .
投稿したリンクに問題がなく、(たとえば) Facebook ログインとWeb のログイン フロー (JavaScript SDK なし) の Facebook ヘルプに従っていると仮定して、動作するテスト アプリケーションを作成します。
一般的なプロセスには、ユーザーにとって意味のある複数のユーザー ジャーニー アプローチが必要です。
- ログインしているユーザーの場合 (ローカル アカウントを使用)
- Facebookにログインしてアカウントを関連付けさせます
- Facebookログインを使用するサイト上の既存のアカウントを統合させます
- ログインユーザーの場合(Facebookアカウントを使用)
- 彼らにローカルアカウントを作成させてください
- サイトの既存のローカル アカウントを統合できるようにする
- ローカル アカウントを登録しようとする、ログインしていないユーザーの場合
- この新しいアカウントを既に登録されている facebook ログインとマージさせ、登録プロセスの一部としてそれを行います。
- Facebookアカウントを登録しようとする(または初めてログインしようとする)ログインしていないユーザーの場合
- 登録プロセスの一環として、これを既存のローカル アカウントにリンクさせます。
等
許可を求めます
(OAuth プロバイダーが一致する識別情報 (電子メール アドレスなど) を返信している場合は、これをスキップできます)。
通常は、マージのターゲット アカウントに送信される確認メールを通じて、確認セキュリティを強化する必要があります。さもないと:
- 誰かが初めて Facebook であなたのサイトにログインできる
- そのプロセス中に、彼らがローカルアカウントのメールアドレスまたはユーザー名を「所有している」と言います(Facebookは必ずしも彼らのメールがあなたのためのものであるかを確認しないことを覚えておいてください)
- したがって、既存のローカル アカウントにアクセスできます。
そのため、マージの「リクエスト」が行われると、マージのターゲット アカウントから続行する許可を求める必要があります。
MVC 4 アカウントコントローラー
OAuth の例として Facebook を使用します。ローカル認証フレームワークと OAuth にユーザーを登録するとどうなるかを比較するには:
- ローカル: webpages_Membership にエントリを作成し、UserProfile に同じ UserId を持つエントリを作成します (MVC 4 アプリケーション テンプレートのデフォルト テーブルを使用していると仮定します)。
- OAuth: webpages_OAuthMembership にエントリを作成し、UserProfile に同じ UserId を持つエントリを作成します。
次に、ユーザーが Facebook を使用して初めてサインインしたときに何が起こるかを見てみましょう。
- Facebookを使用してログインをクリックします(またはボタンの内容は何でも)
- 彼らはログインするためにFacebookに連れて行かれます
- それらは成功します(それを仮定して、失敗のケースを無視しましょう)
- その後、目に見えない形で送信されます。
/Account/ExternalLoginCallback
OAuthWebSecurity.SerializeProviderUserId
が呼び出され、OAuth の詳細がその Action に渡されます
- 彼らはあなたのサイトにリダイレクトされ
/Account/ExternalLoginConfirmation
、あなたのサイトでの新しい存在のためにユーザー名を提供するよう求められます
- そのユーザー名が使用可能な場合、UserProfile および webpages_OAuthMembership エントリが作成されます
このプロセスは、いくつかの固有の情報を照合して、アカウントに「参加」するチャンスです。UserId
UserProfile、webpages_Membership、webpages_OAuthMembership で同じ結果になる限り、問題ありません。したがって、 の時点でプロセスをインターセプトする必要があり/Account/ExternalLoginConfirmation
ます。
OAuth プロバイダーが一致する識別情報 (メール アドレスなど) を送り返した場合、これは簡単になり、ExternalLoginConfirmation
アクションでこれをテストし、以下に概説するプロセスと同様のプロセスを使用して自動マージします。
ただし、ユーザーがサイトと OAuth に同じメール アドレスを使用しているとは想定できない/想定すべきではないと思います (多くの理由からそうすべきではありません)。また、おそらく FacebOogLiveWitter のようなものの T&C では、アカウントの電子メールを要求することを止めてしまいます。
代わりに、ユーザー名やメール アドレス、電話番号などの代替手段に基づいてアカウントをリンクすることができます。いずれにしても、アカウントに対して一意の識別情報を入力する必要があり、ターゲット アカウントを引き戻します。
まとめ
まとめると、この回答の最初の部分で、アカウントを統合するために複数のユーザー ジャーニーを検討する必要があることを概説しました。4.1 の例を使用します。
プロセスには次のことが必要です。
(仮定 - ユーザーが最初にローカル アカウントに登録するときに、電子メール アドレスを尋ねて検証するか、有効であると仮定します)
- ユーザーが facebook で初めてログインできるようにする
Account/ExternalLoginConfirmation
彼らがしたいかどうか彼ら
に尋ねる
- あなたと一緒に新しいアカウントを作成する
- Facebook ログインを使用して既存のアカウントにアクセスする
- 後者を想定すると、次のように新しいテーブル (おそらく "MergeAccountRequests") にリクエストを記録します。
- Facebook アカウントの UserId
- ターゲット マージ ローカル アカウントの UserId
- 送信する必要のある電子メールで使用する認証コード (この時点から、マージを確認せずにログインした場合、他のデータベース テーブルにオブジェクトを作成するのではなく、確認を求めるページに送信する必要があります。後で心配する必要があります)
- 次に、ターゲットのマージ (ローカル) アカウントのアドレスにメールを送信して、マージを完了する許可を求めます (リンク付きの標準の確認メール)。
- 相手がそのリンクをクリックするか、あなたが送信したコードを入力すると (メールだけでなく SMS も使用できます)、2 つのアカウントを統合する必要があります。
- 「新規」および「ターゲット アカウント」を選択します (この場合、「新規」は Facebook アカウントに関連付けられたデータがまだないためです)。
- 「新しい」アカウントの UserProfile を削除します
- 「新しい」アカウント webpages_OAuthMembership テーブルの UserId を「ターゲット」アカウントと同じに変更します
- ユーザーをログアウトします (そのため、現在ログインしているアカウントに応じて複雑になることはありません)
- マージがほぼ完了し、いずれかのアカウントでログインしてマージを確認および完了することができることを伝えるメッセージをユーザーに表示します。
ログインページに送信するのではなく、確認メッセージと一緒にログインオプションを提供します.