我使用ADFS 2.0已经有一段时间了,并且我了解它是如何工作的。我已经完成了许多自定义RP,自定义STS以及使用ADFS作为依赖STS。

但是,我有一个简单的要求,但我仍然无法满足。

我希望我的用户在某个固定时间后被迫重新登录。假设1分钟是出于测试目的。

首先,我在RP方面做了一些更正。似乎由于未知原因,即使 token 的validTo指向了时间,RP也保留了该 session 。这与Vittorio Bertocci在他的书(第123页)中所说的相反,他在书中展示了如何执行滑动过期-他说“SessionAuthenticationModule将在此之后处理过期的 session ”。好吧,对我而言并没有,但是我在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方面的问题。当 token 无效时,应用程序将其清除并重定向到登录页面。

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

但是ADFS会愉快地创建一个新 session ,而不会提示用户。

我已将此RP的 token 生存期设置为1:
Set-ADFSRelyingPartyTrust -Targetname "myrpname" -TokenLifetime 1

并使用Get-ADFSRelyingPartyTrust可以看到将其设置为1(我什至在页面上打印 token validTo来确认设置正确)。

然后,我使用ADFS-SetProperties设置ADFS属性:
ADFS-SetProperties -SsoLifetime 1
ADFS-SetProperties -ReplyCacheExpirationInterval 1
ADFS-SetProperties -SamlMessageDeliveryWindow 1

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

该方案适用于我的自定义STS,其中STS session 的有效性基于Forms cookie-如果我将STS的Forms cookie超时设置为1,则在RP应用程序中闲置1分钟后,我将重定向到的登录页面。我的RP,然后将其重定向到显示其登录页面的STS。

但是,ADFS 2.0并非如此。闲置一分钟后,我被重定向到RP的登录页面,该页面又重定向到ADFS的登录页面,该页面又愉快地重定向回去,就像该 session 在ADFS中仍处于事件状态一样。

我希望有人:

(1)查看顶部描述的骇客,并说明为什么过期的 token 不会自动被拒绝,并且需要这种丑陋的骇客

(2)说明如何在ADFS 2.0端适本地使 session 超时,以便使用登录页面来保护续订 token 的请求。

提前致谢。

编辑

我可以确认将所有上述参数设置为1分钟会使5分钟(或更长时间)后的ADFS session 无效。那是阶段性的,似乎我犯了一个基本错误,或者5分钟是最小可接受值。

我上面的(2)只是为了确认和解释我的观察。

最佳答案

根据上面的注释(与OP共同努力), Freshness 实例上的 FederatedPassiveSignIn 属性应设置为0。

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

关于c# - 与ADFS 2.0联合时如何正确设置超时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9130999/

10-11 17:24