我们正在使用Windows Identity Foundation为我们的应用程序实施单点登录解决方案。我遇到的问题是,当我认为它应该在依赖方方面时,FedAuth cookie不会过期。
在其ValidTo时间之后,大约五分钟后,FedAuth cookie才会被破坏。出于测试目的,我将令牌生存期和会话设置为在十分钟后超时。
<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,因为我们正在使用滑动会话。代码几乎是从Programming Windows Identity Foundation逐字逐句地获取的,但我不认为这是问题,因为我已经尝试在SessionSecurityTokenReceived事件中注释掉代码并且我看到了相同的行为,但仅仅是为了完整性。 / p>
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:00登录应用程序,同时调试上面的代码我可以看到validTo值是上午10点10分。然后我让应用程序坐了11分钟,然后点击另一个链接。在调试上面我看到now(10:11 am)的值确实是&gt; validTo(10:10 am)因此令牌过期未更新。此时我希望SAM能够破坏FedAuth cookie。但是,FedAuth cookie没有被破坏,Request.IsAuthenticated的值仍然是真的(由于我假设存在cookie)并且用户继续访问该应用程序。直到凌晨10点15分才实际看到cookie过期(使用Fiddler)。
我很遗憾为什么FedAuth cookie在validTo时间到期后第一次访问时没有被销毁。我可以通过设置我的到期时间比我真正希望的那样少五分钟来捏造它,但我更愿意理解为什么我会看到这种行为。
答案 0 :(得分:3)
这是因为存在时钟偏差,默认情况下我设置为5分钟。通常,时钟偏差用于缓解服务器之间的时钟同步(在这种情况下是同一服务器场的服务器)。如果要禁用或减少该值,可以通过设置(从我的头脑中)
来实现 FederatedAuthentication.ServiceConfiuration.MaxClockSkew = TimeSpan.FromSeconds(10);
确保服务器时钟100%同步