c# - 与 ADFS 2.0 联合时如何正确设置超时

标签 c# wif adfs2.0

我使用 ADFS 2.0 已经有一段时间了,我了解其工作原理。我已经完成了许多自定义 RP、自定义 STS 以及使用 ADFS 作为依赖 STS。

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

我希望我的用户在一段时间后被迫重新登录。假设 1 分钟,用于测试目的。

首先,我在 RP 端做了一些修正。似乎出于未知原因,RP 保留 session ,即使 token 的 validTo 及时返回。这与 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 的有效性基于表单 cookie - 如果我将 STS 的表单 cookie 超时设置为 1,则在我的 RP 应用程序处于非事件状态 1 分钟后,我将被重定向到我的 RP 的登录页面,然后重定向到显示其登录页面的 STS。

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

我希望有人:

(1) 查看顶部描述的 hack 并解释为什么过期 token 不会被自动拒绝并且需要这种丑陋的 hack

(2) 解释如何正确地使 ADFS 2.0 端的 session 超时,以便更新 token 的请求受到登录页面的保护。

提前致谢。

编辑

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

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

最佳答案

根据上面的评论(与 OP 共同努力)Freshness FederatedPassiveSignIn上的属性(property)实例应设置为 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/

相关文章:

wcf - 使用证书加密数据时如何使 WIF 使用 RSA15?

asp.net - 如何在设置 ADFS 身份验证时通过 TFS 将 asp.net web 应用程序部署到开发团队

c# - C#/.NET 作为新标准游戏开发平台的可行性?

c# - DataGridView 将文本放在 RowHeader 的 ColumnHeader 中

c# - 使用 Visual C# 2010 Express 在 C# 项目中添加引用 'SHDocVw'

c# - 使用 Windows Identity Foundation 重定向到自定义登录页面

c# - 从 StackTrace 中过滤掉非用户代码方法

forms-authentication - 混合模式联合身份验证和表单例份验证

asp.net-mvc-3 - windows azure ACS 确认用户凭据

single-sign-on - 使用 ADFS 实现单点登录