7

Sliding Sessions for WIF 4.5で説明されているように、Relying Party アプリケーションにスライディング セッションを実装しました。それはうまく機能しますが、誰も話していないように見える問題が 1 つあります。

リンクされたブログ投稿が指摘しているように、RP トークンの有効期限が切れると、次回リクエストを行うときにトークンが STS から再発行されます。もちろん、STS セッションの有効期間が RP のセッション有効期間よりも長いと仮定すると、スライディング セッションを実装している場合はほぼ確実に当てはまります。

いずれにせよ、それはスライディングセッションのすべてのポイントを完全に打ち負かします.

RP セッションが期限切れになったときに何をすべきかについては、誰も話していないようです。私が望むのは、RP セッションがタイムアウトした場合 (通常、誰かが自分のデスクから 10 分間離れたために)、アプリケーションが STS ログイン ページにリダイレクトされ、そこでユーザーが再認証され、その後リダイレクトされることです。私がリクエストしたページ。または、リクエストを行ったときに表示していたページに移動することもできます。

これが可能であることはほぼ確実ですが、それがどのように行われるかはまったくわかりません。

global.asax からの私のコードは次のとおりです。

    private const int InactivityTimeout = 5; // minutes

    void SessionAuthenticationModule_SessionSecurityTokenReceived
        (object sender, SessionSecurityTokenReceivedEventArgs e)
    {
        var now = DateTime.UtcNow;
        var validFrom = e.SessionToken.ValidFrom;
        var validTo = e.SessionToken.ValidTo;
        double halfSpan = (validTo - validFrom).TotalMinutes/2;
        if (validFrom.AddMinutes(halfSpan) < now && now < validTo)
        {
            // add more time
            var sam = sender as SessionAuthenticationModule;

            e.SessionToken = sam.CreateSessionSecurityToken(
                e.SessionToken.ClaimsPrincipal,
                e.SessionToken.Context,
                now,
                now.AddMinutes(InactivityTimeout),
                e.SessionToken.IsPersistent);
            e.ReissueCookie = true;
        }
        else
        {
            // re-authenticate with STS
        }
    }

私の質問:

  1. 句はelse、再認証ロジックを配置する適切な場所ですか?
  2. もしそうなら、私にはわからないので、例を挙げてください。
  3. #1 に対する答えが「いいえ」の場合、サブスクライブする必要がある別のイベントがあり、「ねえ、セッション セキュリティ トークンの有効期限が切れています!」と通知されますか?
4

1 に答える 1

2

STS と RP のセッション ライフタイムを同期することをお勧めします。

セッション ライフタイムを STS で 10 分、RP で 10 分に設定し、RP でスライディング セッション アプローチを使用できます。非アクティブ状態が 10 分間続くと、両方のセッションが期限切れになり、ユーザーは再認証する必要があります。

複数の RP がある場合、RP から STS へのキープアライブの形式を実装できます。たとえば、RP 上のすべての Web ページで STS からリソースをロードします。ページが RP に読み込まれるたびに、キープアライブ リソースが STS から読み込まれ、STS セッションが更新されます。非アクティブ状態が 10 分間続くと、タイムアウトになり、ユーザーは再認証する必要がありました。

「STS からのリソース」とは、非表示の iframe に読み込まれた Web ページ (Web フォーム/MVC) を意味する場合があります。重要なことは、これがマネージ ハンドラーであるため、要求が ASP.NET によって処理されることです。

質問に関しては、セッションの有効期間を同期して一緒にタイムアウトする場合:

  1. いいえ、else 句にコードを追加する必要はありません。トークンの有効期限が切れている場合、WIF は STS にリダイレクトします。
  2. else 句を削除するだけです。
  3. これは WIF に任せてください。

完全を期すために、セッションの有効期間を同期できない場合は、RP セッションの有効期限が切れたときにフェデレーション サインアウトをトリガーできます。次のスニペットは、構成された発行者 (STS) でサインアウトをトリガーします。これをelse句に入れて、RPセッションの有効期限が切れた後の最初のリクエストでサインアウトをトリガーできます:

using System.IdentityModel.Services; //WIF 4.5

var stsAddress = new Uri(FederatedAuthentication.FederationConfiguration.WsFederationConfiguration.Issuer);
WSFederationAuthenticationModule.FederatedSignOut(stsAddress, null); //Optional replyUrl set to null

それが役立つことを願っています!

于 2013-09-16T19:31:57.737 に答える