如何在与ADFS 2.0联合时正确设置超时

时间:2012-02-03 15:20:00

标签: c# wif adfs2.0

我使用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;
                }
            };

这个技巧解决了RP方面的问题。当令牌无效时,应用程序将其清除并重定向到登录页面。

现在出现了问题。我的登录页面使用FederatedPassiveSignIn控件。单击时,它会将浏览器重定向到ADFS。

但ADFS很乐意创建一个新会话,而不会提示用户。

我已将此RP的令牌生命周期设置为1:

Set-ADFSRelyingPartyTrust -Targetname "myrpname" -TokenLifetime 1

并使用Get-ADFSRelyingPartyTrust我可以看到它已设置为1(我甚至在页面上打印了令牌validTo以确认设置正确)。

然后我用ADFS-SetProperties设置ADFS属性:

ADFS-SetProperties -SsoLifetime 1
ADFS-SetProperties -ReplyCacheExpirationInterval 1
ADFS-SetProperties -SamlMessageDeliveryWindow 1

但仍然没有运气。我现在被困住了。

该方案适用于我的自定义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)现在只是为了确认和解释我的观察。

3 个答案:

答案 0 :(得分:8)

根据上述评论(与OP的共同努力),Freshness实例上的FederatedPassiveSignIn属性应设置为0.

根据http://docs.oasis-open.org/wsfed/federation/v1.2/ws-federation.html,这表示IP / STS在发出令牌之前重新提示用户进行身份验证。

答案 1 :(得分:1)

您还可以尝试将ADFS从Windows集成身份验证更改为基于表单的身份验证。您可能仍需要使用新鲜属性,但现在您的用户必须输入他们的凭据,即使他们与您的AD在同一网络上。

本文非常简单地解释了它:

http://social.technet.microsoft.com/wiki/contents/articles/1600.aspx

答案 2 :(得分:0)

设置TokenLifetime值不起作用很奇怪。 article in MSDN将超时解释为直接设置 - 通过分配TokenLifetime值。我很想知道MSDN中描述的设置是否正确。如果这没有帮助,那么现在是修改那篇文章的时候了。希望这对那些面临这个问题的人有很大的帮助。