我使用ADFS 2.0已经有一段时间了,我理解它是如何工作的.我已经完成了十几个自定义RP,自定义STS以及使用ADFS作为依赖STS.
但是,我有一个简单的要求,我仍然无法实现.
我希望我的用户在一段固定的时间后被迫重新登录.我们说1分钟,用于测试目的.
首先,我在RP方面进行了一些修正.似乎由于未知原因,即使令牌的validTo时间点回到原点,RP也会保留会话.这与Vittorio Bertocci在他的书(第123页)中所说的相反,他在书中展示了如何执行滑动过期 - 他说"SessionAuthenticationModule将负责处理过期的会话".好吧,对我来说它没有,但是我在这里找到了一个技巧http://blogs.planbsoftware.co.nz/?p=521 - 看看"if"条款:
sam.SessionSecurityTokenReceived +=
( s, e ) =>
{
SessionAuthenticationModule _sam = s as SessionAuthenticationModule;
DateTime now = DateTime.UtcNow;
DateTime validFrom = e.SessionToken.ValidFrom;
DateTime validTo = e.SessionToken.ValidTo;
try
{
double halfSpan = ( validTo - validFrom ).TotalSeconds / 2;
if ( validTo < now )
{
_sam.DeleteSessionTokenCookie();
e.Cancel = true;
}
}
catch ( Exception ex )
{
int v = 0;
}
};
Run Code Online (Sandbox Code Playgroud)
这个技巧解决了RP方面的问题.当令牌无效时,应用程序将其清除并重定向到登录页面.
现在出现了问题.我的登录页面使用该FederatedPassiveSignIn控件.单击时,它会将浏览器重定向到ADFS.
但ADFS很乐意创建一个新的会话,而不会提示用户.
我已将此RP的令牌生命周期设置为1:
Set-ADFSRelyingPartyTrust -Targetname "myrpname" -TokenLifetime 1
Run Code Online (Sandbox Code Playgroud)
并且使用Get-ADFSRelyingPartyTrust我可以看到它被设置为1(我甚validTo至在我的页面上打印令牌以确认这是正确设置的).
然后我用以下方法设置ADFS属性ADFS-SetProperties:
ADFS-SetProperties -SsoLifetime 1
ADFS-SetProperties -ReplyCacheExpirationInterval 1
ADFS-SetProperties -SamlMessageDeliveryWindow 1
Run Code Online (Sandbox Code Playgroud)
但仍然没有运气.我现在被困住了.
该方案与我的自定义STS正常工作,其中STS会话的有效性基于Forms cookie - 如果我将STS的表单cookie超时设置为1,在我的RP应用程序中1分钟不活动后,我被重定向到登录页面我的RP然后重定向到STS,它显示其登录页面.
但是,ADFS 2.0不是这种情况.在一段时间不活动之后,我被重定向到我的RP的登录页面,该页面重定向到ADFS的登录页面,该登录页面又快乐地重定向回来,就像会话在ADFS中仍然是活动的一样.
我希望有人:
(1)看看顶部描述的hack并解释为什么过期的令牌不会被自动拒绝,并且需要这样丑陋的黑客攻击
(2)解释如何在ADFS 2.0端正确地超时会话,以便使用登录页面保护更新令牌的请求.
提前致谢.
编辑
我可以确认将所有上述参数设置为1分钟会使ADFS会话在5分钟(或更长时间)后无效.这是一种策略,似乎我犯了一个基本错误或者5分钟是最低可接受的价值.
从上面我的(2)现在只是为了确认和解释我的观察.
根据上面的评论(与OP共同努力)Freshness,FederatedPassiveSignIn实例上的属性应设置为0.
根据http://docs.oasis-open.org/wsfed/federation/v1.2/ws-federation.html,这表明IP/STS在发出令牌之前重新提示用户进行身份验证.
| 归档时间: |
|
| 查看次数: |
13577 次 |
| 最近记录: |