1

各ユーザーを一意に識別するために使用する必要があると主張する、このよう質問がかなりあります。ClaimedIdentifier

ログインに成功した後ClaimedIndentifier、データベースに保存しています。ユーザーがログインするたびに、レコードを調べてClaimedIdentifier. ClaimedIdentifiersしかし、私はそれが変化していることに気づきました。ユーザーを識別するためにデータベースに何を保存する必要がありますか。Googleアカウントを使用しています。これは、データベースに保存する方法です

OpenIdRelyingParty rp = new OpenIdRelyingParty();
IAuthenticationResponse r = rp.GetResponse();
UserController.addUser(new UserController.User(r.ClaimedIdentifier.ToString(), 0));
4

1 に答える 1

5

これは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

于 2013-01-31T04:58:52.320 に答える