【问题标题】:WIF sliding session re-authenticateWIF 滑动会话重新认证
【发布时间】:2013-09-09 14:07:35
【问题描述】:

Sliding Sessions for WIF 4.5 中所述,我已在我的依赖方应用程序中实现了滑动会话。就目前而言,这很有效,但有一个问题似乎没有人谈论。

正如链接的博客文章指出的那样,当 RP 令牌过期时,下次发出请求时,令牌会从 STS 重新发出。当然,假设 STS 会话的生命周期比 RP 的会话生命周期长,如果您正在实施滑动会话,几乎可以肯定是这种情况。

无论如何,这完全违背了滑动会话的全部意义。

似乎没有人谈论的是当 RP 会话到期时该怎么做。我想要是,如果 RP 会话超时(通常是因为有人离开他的办公桌 10 分钟),我的应用程序将重定向到用户可以重新验证的 STS 登录页面,然后被重定向回我请求的页面;或者可能是我提出请求时所在的页面。

我几乎可以肯定这是可能的,但我完全不知道它是如何做到的。

这是我来自 global.asax 的代码:

    private const int InactivityTimeout = 5; // minutes

    void SessionAuthenticationModule_SessionSecurityTokenReceived
        (object sender, SessionSecurityTokenReceivedEventArgs e)
    {
        var now = DateTime.UtcNow;
        var validFrom = e.SessionToken.ValidFrom;
        var validTo = e.SessionToken.ValidTo;
        double halfSpan = (validTo - validFrom).TotalMinutes/2;
        if (validFrom.AddMinutes(halfSpan) < now && now < validTo)
        {
            // add more time
            var sam = sender as SessionAuthenticationModule;

            e.SessionToken = sam.CreateSessionSecurityToken(
                e.SessionToken.ClaimsPrincipal,
                e.SessionToken.Context,
                now,
                now.AddMinutes(InactivityTimeout),
                e.SessionToken.IsPersistent);
            e.ReissueCookie = true;
        }
        else
        {
            // re-authenticate with STS
        }
    }

我的问题:

  1. else 子句是否适合放置重新身份验证逻辑?
  2. 如果是这样,请提供一个示例,因为我不知道。
  3. 如果对 #1 的回答是否定的,那么我是否需要订阅一个单独的事件来告诉我“嘿,您的会话安全令牌已过期!”?

【问题讨论】:

    标签: authentication wif thinktecture-ident-server


    【解决方案1】:

    我建议您在 STS 和 RP 上同步会话生命周期。

    您可以在 STS 上将会话生命周期设置为 10 分钟,在 RP 上设置为 10 分钟,并在 RP 上使用滑动会话方法。闲置 10 分钟后,两个会话都将过期,应要求用户重新进行身份验证。

    如果您有多个 RP,您可以实施一种从 RP 到 STS 的 keep-alive 形式 - 例如在 RP 上的每个网页中从 STS 加载资源。每当在 RP 上加载页面时,将从 STS 加载保活资源 - 刷新 STS 会话。在 10 分钟不活动后,它们都会超时,用户必须重新进行身份验证。

    “来自 STS 的资源”可能是指加载在不可见 iframe 中的网页(Web 窗体/MVC)。重要的是它是一个托管处理程序,因此请求由 ASP.NET 处理。

    至于您的问题,如果您同步会话生命周期以便它们一起超时:

    1. 不,您不需要在 else 子句中添加任何代码。如果令牌过期,WIF 将重定向到 STS。
    2. 只需删除 else 子句。
    3. 让 WIF 为您处理。

    为了完整起见,如果您无法同步会话生命周期,您可以在 RP 会话到期时触发联合注销。以下 sn-p 在配置的颁发者 (STS) 处触发注销。您可以将其放在 else 子句中,以在 RP 会话到期后触发第一个请求的注销:

    using System.IdentityModel.Services; //WIF 4.5
    
    var stsAddress = new Uri(FederatedAuthentication.FederationConfiguration.WsFederationConfiguration.Issuer);
    WSFederationAuthenticationModule.FederatedSignOut(stsAddress, null); //Optional replyUrl set to null
    

    希望有帮助!

    【讨论】:

    • 感谢您的回复。我不想同步会话生命周期,因为这会迫使用户每 10 分钟重新验证一次。想象一下,如果您在 Visual Studio 中工作时必须这样做。我想要的是让它像我的 Windows 机器一样工作:只要我使用计算机,我的会话就保持有效。但如果我空闲 5 分钟,它会锁定我的工作站,我必须重新进行身份验证。只要我可以返回到我离开的页面,联合注销就可以工作。我会试试看。
    • 当您在 RP 上实施滑动会话时,我不明白用户必须如何每 10 分钟重新验证一次。
    • 如果我按照您的建议在 STS 上将会话生存期设置为 10 分钟,那么 STS 令牌将在 10 分钟后过期。 RP 不能将令牌的生命周期延长到超过 STS 令牌允许的时间。除非我误解了你写的东西?
    • 如果在配置中为 sessionSecurityTokenHandler 设置会话安全令牌生命周期,则不能将会话令牌生命周期延长到 STS IIRC 颁发的令牌生命周期之外。我很确定滑动会话实现会覆盖它,但我可能记错了。即使您延长了 RP 上会话令牌的生命周期,您仍然被重定向到 STS?
    • @JimMischel 我想知道你是否实现了你想要的。我想做同样的事情,在 else 子句中,我已经输入了 klings 建议的注销代码 FederatedSignout... 但我不断收到一般错误“抱歉,处理您的请求时发生错误。”,我使用 Thinktecture IdentityServer。
    猜你喜欢
    • 2014-03-25
    • 2015-07-12
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 2016-06-14
    • 1970-01-01
    相关资源
    最近更新 更多