2

Windows Identity Foundation を使用して、アプリケーションのシングル サインオン ソリューションを実装しています。私が直面している問題は、Relying Party 側で FedAuth Cookie の有効期限が切れているはずなのに、有効期限が切れていないことです。

FedAuth Cookie は、ValidTo 時刻から約 5 分まで破棄されません。テスト目的で、トークンの有効期間とセッションを 10 分後にタイムアウトするように設定しました。

<sessionState timeout="10" mode="SQLServer" sqlConnectionString="..." />

<securityTokenHandlers>
  <add type="Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
    <sessionTokenRequirement lifetime="00:10" />
  </add>
</securityTokenHandlers>  

スライディング セッションを使用しているため、独自の SessionAuthenticationModule を実装しました。コードはWindows Identity Foundation のプログラミングからほぼそのまま引用されていますが、SessionSecurityTokenReceived イベントでコードをコメントアウトしようとしたため、それが問題ではないと思いますが、完全を期すために同じ動作が見られます。

DateTime now = DateTime.UtcNow;
DateTime validFrom = e.SessionToken.ValidFrom;
DateTime validTo = e.SessionToken.ValidTo;

double tokenLifetime = (validTo - validFrom).TotalMinutes;

if( now < validTo && now > validFrom.AddMinutes( tokenLifetime / 2 ) )
{
    SessionAuthenticationModule sam = sender as SessionAuthenticationModule;
    e.SessionToken = sam.CreateSessionSecurityToken(
        e.SessionToken.ClaimsPrincipal, e.SessionToken.Context,
        now, now.AddMinutes( tokenLifetime ), e.SessionToken.IsPersistent );
    e.ReissueCookie = true;
}

上記のコードのデバッグ中に午前 10 時にアプリにサインインすると、validTo の値が午前 10 時 10 分であることがわかります。次に、アプリを 11 分間放置し、別のリンクをクリックします。上記をデバッグすると、now (午前 10 時 11 分) の値が確かに > validTo (午前 10 時 10 分) であるため、トークンの有効期限が更新されていないことがわかります。この時点で、SAM が FedAuth Cookie を破棄することを期待しています。ただし、FedAuth Cookie は破棄されず、Request.IsAuthenticated の値は依然として true であり (私が想定している Cookie が存在するため)、ユーザーは引き続きアプリケーションにアクセスします。(Fiddler を使用して) Cookie の有効期限が切れているのを実際に確認するのは、午前 10 時 15 分までではありません。

I'm at a loss as to why the FedAuth cookie isn't being destroyed on the first access after the validTo time has expired. I can fudge it by setting my expiration times to be five minutes less than what I really want them to be, but I'd prefer to understand why I'm seeing this behavior.

4

1 に答える 1

3

これは、デフォルトで 5 分に設定されているクロック スキューがあるために発生します。通常、クロック スキューは、サーバー (この場合は同じファームのサーバー) 間のクロック同期を軽減するために使用されます。その値を無効にしたり減らしたりしたい場合は、(私の頭の上から)設定することでそれを行うことができます

FederatedAuthentication.ServiceConfiuration.MaxClockSkew = TimeSpan.FromSeconds(10);

サーバーのクロックが 100% 同期されていることを確認してください

于 2012-09-28T13:59:27.527 に答える