2

WIF を使用して STS をセットアップしましたが、ユーザーがサインインしているかどうかを公開して、ユーザーがサインインしているかどうかを RP が判断できるようにしたいと考えています。ユーザーが STS にリダイレクトして戻る必要はありません。ユーザーがサインインしている場合、RP で別のプロセス フローが発生するため、プロセスのこの時点でサインインを強制するのではなく、知っておくことが重要です。

私の計画は、HttpWebRequest を介してヒットすると、context.User.Identity.IsAuthenticated の出力を返す単純な汎用ハンドラーを STS に作成することでした (ここで、context は ProcessRequest メソッドに渡される HttpContext です:

public void ProcessRequest(HttpContext context)
{
    context.Response.ContentType = "text/plain";

    if (context.User != null && context.User.Identity.IsAuthenticated)
        context.Response.Write("True");
    else
        context.Response.Write("False");
}

私の問題は、ユーザーがサインインしていて、このハンドラーを直接ヒットするとTrueが返されますが、RPからプログラムでハンドラーをヒットするとFalseが返されることです(実際、IDはnullです)。これを行うのは完全に間違っていますか? RP からハンドラーをヒットすると、RP でユーザーのステータスが返されますか、何か間違っている可能性がありますか?

4

2 に答える 2

0

これが少し古いスレッドであることは知っていますが、その答えは、このページにたどり着いた他の人に役立つかもしれません.

認証の背後でマジックを行うのは、STS アプリからユーザーのクライアント (ブラウザーなど) に送信されるセッション Cookie と認証 Cookie です。あなたの STS および RP アプリがどのように設計され、どのように通信されているかはわかりません。そのため、回答は一般的なものにしておきます。RP アプリに認証ステータスを通知するには、次のことを行う必要があります。

1) ユーザーのクライアントと RP アプリの間で両方の Cookie を何らかの方法で共有します。このシナリオでは、独自のクライアントを構築し、ユーザーがそれを使用して STS アプリにアクセスできるようにする必要があります。これは、標準のブラウザーから Cookie を取得できないためです。作成したクライアントは、RP アプリが Cookie を取得できる場所に Cookie を送信し、HttpWebRequest.CookieContainer に配置します。これにより、ハンドラーの結果を正常に取得できます。この方法を説明しているのは、それが実行可能であり、それがどれほど複雑でねじれているかを示すためだけです。

2) または、ユーザーのログイン ステータスを追跡する必要があります。context.User をチェックする代わりに、ハンドラーは呼び出し元の RP アプリからユーザー ID を取得し、そのユーザーがログインしているかどうか (つまり、そのユーザーのアクティブなセッションがあるかどうか) をチェックする必要があります。たとえば、セッションを追跡またはデータベースに保存したり、アクティブなセッションにアクセスする方法について次のスレッドを参照したりできます。

アクティブな ASP.NET セッションをすべて一覧表示する

于 2014-01-20T16:38:13.757 に答える
0

このハンドラーは、要求で STS 認証 Cookie を送信した場合にのみ機能します (true を返します)。これらの Cookie を使用できるのは、お使いの Web ブラウザーのみです。したがって、HttpWebRequest 経由では実行できません。これが、ブラウザから直接ハンドラを呼び出すときに機能する理由でもあります。

于 2012-10-18T09:49:34.970 に答える