あなたのコードにはいくつかの問題があります。最初に直接の質問に答えるために、Google が再訪問時にあなたを覚えていない理由は、ログインするたびに Realm の一部としてランダムな GUID を渡しているためです。Google が再訪問時にユーザーにプロンプトを表示するだけでなく、再訪問時に Google が新しい要求された識別子を ユーザーに与えるため、サイトは再訪問時にユーザーをまったく認識しません。
修正は、すべてのログイン リクエストに対してまったく同じ Realm を使用する必要があることです。
Realm realm = "http://www.yoursite.com/";
var req = openid.CreateRequest(discoveryUri, realm, URIbuilder.Uri );
または私の個人的なお気に入り:
var req = openid.CreateRequest(discoveryUri, Realm.AutoDetect, URIbuilder.Uri );
Realm.AutoDetect
あなたのサイトがHTTP と HTTPS の 両方で利用できる場合を除いて、あなたのために働く.
また、3 番目のパラメーターとして渡す returnTo URL は、CreateRequest
常にレルムに基づいている必要があることも覚えておく必要があります。したがって、レルムが HTTPS の場合、returnTo パラメータも HTTPS でなければなりません。
また、受け入れたすべての OpenID 応答が、送信した要求からのものであることを確認するために、いくつかの GUID コードと複雑な URL 操作を行っているように見えることも指摘したいと思います。そもそもなぜこれをやろうとしているのかはわかりませんが、確かに正当な理由がある可能性があります. あなたが行った方法は安全ではなく、回避することができます。これを web.config ファイルに追加する代わりに、このコードをすべて削除することをお勧めします。
<dotNetOpenAuth>
<openid>
<relyingParty>
<security rejectUnsolicitedAssertions="true" />
</relyingParty>
</openid>
</dotNetOpenAuth>
このライブラリは、すべての応答が要求から来ることを要求するサポートを組み込みで備えており、これを安全に行うため、先ほど触れたセキュリティの悪用は不可能です。
ただし、この制限を適用して Google から送信されたものであることを確認するだけの場合は、一方的なアサーションを拒否する代わりに、IAuthenticationResponse.Provider.Uri
応答を受信したときにプロパティをチェックし、それが Google OP エンドポイントからのものであることを確認することをお勧めします。 ? 次に、Google が未承諾のアサーションの送信をサポートしていた場合、それはあなたのサイトで機能し、最終的にセキュリティ ゲートは意図したとおりの場所になります。