Authentication 滑动会话重新验证

Authentication 滑动会话重新验证,authentication,wif,thinktecture-ident-server,Authentication,Wif,Thinktecture Ident Server,我已经在依赖方应用程序中实现了滑动会话,如中所述。就目前而言,这很有效,但有一个问题似乎没有人谈论 正如链接的博客文章所指出的,当RP令牌过期时,下次发出请求时,该令牌将从STS重新发出。当然,假设STS会话生存期比RP的会话生存期长,如果您正在实现滑动会话,几乎可以肯定这一点 无论如何,这完全违背了滑动会话的全部要点 似乎没有人谈论RP会话到期时该怎么办。我想要的是,如果RP会话超时(通常是因为有人离开他的办公桌10分钟),我的应用程序将重定向到STS登录页面,在那里用户可以重新验证,然后重定

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

正如链接的博客文章所指出的,当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
        }
    }
private const int InactivityTimeout=5;//会议记录
无效会话身份验证模块\u会话安全性已收到
(对象发送方,SessionSecurityTokenReceivedEventArgs e)
{
var now=DateTime.UtcNow;
var validFrom=e.SessionToken.validFrom;
var validTo=e.SessionToken.validTo;
双半跨度=(validTo-validFrom).TotalMinutes/2;
if(有效时间从.AddMinutes(halfSpan)
我的问题是:

  • else
    子句是否是放置重新验证逻辑的适当位置
  • 如果是,请举个例子,因为我不知道
  • 如果#1的答案是否,那么我是否需要订阅一个单独的事件,该事件将告诉我“嘿,您的会话安全令牌已过期!”

  • 我建议您同步STS和RP上的会话生存时间

    您可以在STS上将会话生存时间设置为10分钟,在RP上将会话生存时间设置为10分钟,并在RP上使用滑动会话方法。在10分钟不活动后,两个会话都将过期,并且应要求用户重新验证

    如果您有多个RPs,您可以实现从RP到STS的保持活动形式-例如,在RPs上的每个网页中从STS加载资源。无论何时在RP上加载页面,都会从STS加载保持活动的资源—刷新STS会话。10分钟不活动后,它们都将超时,用户必须重新验证

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

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

  • 不,您不需要在else子句中添加任何代码。如果令牌过期,WIF将重定向到STS
  • 只需删除else子句
  • 让WIF为您处理这件事
  • 为了完整性,如果无法同步会话生存期,则可以在RP会话过期时触发联合注销。以下代码段在已配置的颁发者(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颁发的令牌的生存期之外。我很确定滑动会话实现会覆盖这一点,但我可能记错了。你仍然被重定向到STS,即使你延长了RP上会话令牌的生命周期?@JimMischel我想知道你是否实现了你想要的。我也希望做同样的事情,在else子句中,我输入了klings建议的签出代码,
    FederatedSignout…
    但我一直收到一个一般性错误“对不起,在处理您的请求时发生了错误”。我使用的是Thinktecture IdentityServer。