Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure WIF会话安全性到期_Azure_.net 4.5_Wif_Claims Based Identity_Acs - Fatal编程技术网

Azure WIF会话安全性到期

Azure WIF会话安全性到期,azure,.net-4.5,wif,claims-based-identity,acs,Azure,.net 4.5,Wif,Claims Based Identity,Acs,我正在尝试实现滑动会话过期。我正在使用WindowsAzure ACS,.NET4.5,WIF。当我第一次收到令牌时,我所做的是将其默认过期时间设置为2小时,并将该令牌写入cookie,如下代码所示: internal void SetSession(ClaimsPrincipal principal) { var sessionToken = new SessionSecurityToken(principal, TimeSpan.FromMinutes(120)); Fede

我正在尝试实现滑动会话过期。我正在使用WindowsAzure ACS,.NET4.5,WIF。当我第一次收到令牌时,我所做的是将其默认过期时间设置为2小时,并将该令牌写入cookie,如下代码所示:

internal void SetSession(ClaimsPrincipal principal)
{
    var sessionToken = new SessionSecurityToken(principal, TimeSpan.FromMinutes(120));
    FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionToken);
    Thread.CurrentPrincipal = principal;
}
    void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e)
    {
        var sessionToken = e.SessionToken;
        var currentDateTime = DateTime.UtcNow.Ticks;
        var sessionExpirationDateTime = sessionToken.ValidTo.Ticks;
        if (sessionExpirationDateTime >= currentDateTime)
        {
            var renewTokenWindow = 5 * 60 * 1000;//5 minutes
            TimeSpan ts = new TimeSpan(sessionExpirationDateTime - currentDateTime);
            if (ts.TotalMilliseconds < renewTokenWindow)
            {
                var newSessionTokenExpiry = sessionToken.ValidTo.AddMinutes(120);
                //Renew token
                SessionAuthenticationModule sam = sender as SessionAuthenticationModule;
                var newSessionToken = sam.CreateSessionSecurityToken(sessionToken.ClaimsPrincipal, sessionToken.Context, sessionToken.ValidFrom, newSessionTokenExpiry, sessionToken.IsPersistent);
                e.SessionToken = newSessionToken;
                e.ReissueCookie = true;
            }
        }
    }
此时,如果我检查
sessionToken
变量的
ValidFrom
ValidTo
属性,我会得到如下屏幕截图所示的正确值:

现在,为了实现滑动会话过期,我正在处理我的
Global.asax
文件中的
SessionAuthenticationModule\u SessionSecurityTokenReceived
事件,如下所示:

    void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e)
    {
        var sessionToken = e.SessionToken;
    }
但是,当我检查令牌的
ValidFrom
ValidTo
属性时,它不是我在将令牌作为cookie写入时设置的,如下面的屏幕截图所示:

不知道为什么会这样。谁能解释一下我做错了什么

更新:

我注意到一件有趣的事。我实现滑动会话的方法是检查令牌的
ValidTo
属性,并将其与当前日期/时间(UTC)进行比较。如果差异小于5分钟,我将
ValidTo
时间增加2小时,然后重新发出cookie,如下面的代码所示:

internal void SetSession(ClaimsPrincipal principal)
{
    var sessionToken = new SessionSecurityToken(principal, TimeSpan.FromMinutes(120));
    FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionToken);
    Thread.CurrentPrincipal = principal;
}
    void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e)
    {
        var sessionToken = e.SessionToken;
        var currentDateTime = DateTime.UtcNow.Ticks;
        var sessionExpirationDateTime = sessionToken.ValidTo.Ticks;
        if (sessionExpirationDateTime >= currentDateTime)
        {
            var renewTokenWindow = 5 * 60 * 1000;//5 minutes
            TimeSpan ts = new TimeSpan(sessionExpirationDateTime - currentDateTime);
            if (ts.TotalMilliseconds < renewTokenWindow)
            {
                var newSessionTokenExpiry = sessionToken.ValidTo.AddMinutes(120);
                //Renew token
                SessionAuthenticationModule sam = sender as SessionAuthenticationModule;
                var newSessionToken = sam.CreateSessionSecurityToken(sessionToken.ClaimsPrincipal, sessionToken.Context, sessionToken.ValidFrom, newSessionTokenExpiry, sessionToken.IsPersistent);
                e.SessionToken = newSessionToken;
                e.ReissueCookie = true;
            }
        }
    }
void SessionAuthenticationModule\u SessionSecurityTokenReceived(对象发送方,SessionSecurityTokenReceivedEventArgs e)
{
var sessionToken=e.sessionToken;
var currentDateTime=DateTime.UtcNow.Ticks;
var sessionExpirationDateTime=sessionToken.ValidTo.Ticks;
如果(sessionExpirationDateTime>=currentDateTime)
{
var renewTokenWindow=5*60*1000;//5分钟
TimeSpan ts=新的TimeSpan(sessionExpirationDateTime-currentDateTime);
如果(ts.total毫秒<更新令牌窗口)
{
var newSessionTokenExpiry=sessionToken.ValidTo.AddMinutes(120);
//续订代币
SessionAuthenticationModule sam=发送方作为SessionAuthenticationModule;
var newSessionToken=sam.CreateSessionSecurityToken(sessionToken.ClaimsPrincipal,sessionToken.Context,sessionToken.ValidFrom,newsessionTokenExpire,sessionToken.IsPersistent);
e、 SessionToken=newSessionToken;
e、 ReissueCookie=true;
}
}
}
在这之后,如果我在后续请求中检查
ValidTo
属性的值,它实际上是遵守我设置的值,如下所示。这个值在一个又一个请求中得到持久化,也就是说,一旦我重新发出令牌,一切都会正常工作


Thinktecture IdentityModel有一个实现,因此您可以通过NuGet引用包,也可以复制源代码:


谢谢你,布罗克。然而,我仍然不明白为什么
ValidTo
value没有设置为我想要的值。这是WIF的错误还是我做了一些不正确的事情?您好Brock/Gaurav-您是否设法找出了
ValidTo
值设置不正确的原因?抱歉。。。我早就应该更新答案了。基本上,默认令牌到期时间是在Windows Azure ACS门户中设置的。无论设置了什么值,都会在第一次拾取。嗯。