これはDotNetOpenAuth固有の問題ではありません。これはGoogleの動作です。GoogleのOpenIDプロバイダーは、ペアごとに一意の識別子と呼ばれるものを発行します。OpenIDレルムが一定である限り、特定のユーザーに対して常に同じになります。
DotNetOpenAuthのOpenIdRelyingParty.CreateRequest
メソッドにレルムを明示的に指定せずにユーザーをログインすると、DotNetOpenAuthは単に現在のWebアプリケーションのルートURLを使用します。これは妥当なデフォルトですが、サイトに複数の方法でアクセスできる場合(たとえば、httpとhttps、またはwww。ホスト名の有無にかかわらず)、デフォルトのレルムは、ユーザーがたまたま使用したURLに基づいて異なります。ログインページにアクセスします。また、レルムが変化すると、Googleが生成したクレーム済み識別子も変化します。
その場合の修正は、1つのレルム(オプションの場合はhttpsスキームを使用するレルムが望ましい)を選択し、それをCreateRequest
メソッドに明示的に提供することです。また、同じメソッドへのreturn_to引数が、選択したレルムと共通のルートを共有していることを確認する必要があります。たとえば、選択したレルムが
https://www.mysite.com/の
場合、return_toがそれに基づいていることを確認する必要があります。次のようなもの:
https ://www.mysite.com/login.aspx
ユーザーがhttp://mysite.com/login.aspxにアクセスした場合、これがreturn_toのデフォルトURLになり、選択したレルムと一致しません。
したがって、全体として、次のようになります。
var request = relyingParty.CreateRequest(
"https://www.google.com/accounts/o8/id",
"https://www.mysite.com/",
new Uri("https://www.mysite.com/login.aspx"));
return_toは、レルムのように各リクエストと完全に同じである必要はないことに注意してください。したがって、複数のログインページURLを設定し、それぞれがreturn_toパラメータとして独自のURLを指定することができます。ただし、すべてのreturn_to URLは、レルムURLに基づいている必要があります。
この変更は、ユーザーがログインできるすべての場所に一貫して適用されるため、Googleから一貫して要求された識別子が表示されるはずです。残念ながら、他のレルムを使用してすでに取得しているクレームされたIDは、この修正後に取得するIDと一致しません。これらのユーザーアカウントをマージする必要があり、ユーザーの電子メールアドレスがある場合は、それに基づいてマージしてみてください。ただし、この手順には十分注意してください。登録しているメールアドレスがそれらのユーザーのものであることが確実な場合にのみ、安全に実行できます。ユーザーがログインしたときにOpenIDを介してこれらの電子メールアドレスを取得し、それが信頼できるOpenIDプロバイダーからのものであり、電子メールを検証していることを再確認した場合は、おそらく問題ありません。GoogleOPIdentifierをハードコーディングするだけでよいことに注意してCreateRequest
くださいGoogleユーザーのみがログインすることを保証するものではありません。それを確認するには、ポジティブアサーションが着信したときにIAuthenticationResponse.Provider.Uri
プロパティが一致することを確認する必要があります。https://www.google.com/accounts/o8/ud