2

dotNetOpenAuth を使用して、ユーザーの Google Apps アカウント経由でアプリに SSO を提供しています。単純な認証だけでなく、Google にユーザーのメールアドレス、姓名を返すように依頼します。ユーザーが最初にアクセスすると、通常の Google アカウント ページにリダイレクトされ、アプリがこの情報を求めていること、許可するかどうかが通知されます。この承認を記憶するためのチェックボックスがあります。問題は、承認が記憶されていないことです。ユーザーがブラウザーを閉じずにサイトに戻った場合、ユーザーは記憶されます。ただし、ブラウザを閉じてから開いて戻ってくると、再度許可するように求められます。

接続されたサイト、アプリ、サービスを表示する Google アカウント ページを確認すると、自分のアプリが複数回表示されます。同じアプリだと認識せず、どんどん追加していく感じです。

明らかな何かが欠けているに違いないことはわかっていますが、それが何であるかはわかりません。何か案は?

ありがとう!

ここで私のコードを見つけることができます

4

1 に答える 1

5

あなたのコードにはいくつかの問題があります。最初に直接の質問に答えるために、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 が未承諾のアサーションの送信をサポートしていた場合、それはあなたのサイトで機能し、最終的にセキュリティ ゲートは意図したとおりの場所になります。

于 2012-06-29T14:38:16.497 に答える