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.