如何在我的MVC应用程序中设置滑动到期,该应用程序使用STS(WIF)进行身份validation

我们正在使用STS开发MVC应用程序。 我们使用WIF工具创建一个简单的STS应用程序进行开发。

我希望能够在我的令牌中设置一个滑动过期(在RP中)。

我看到这里的代码。

不幸的是,这是事件处理程序和示例,虽然有用,但没有显示如何实现处理程序!

在我的global.asax中,Application_Start()我有:

sam = new SessionAuthenticationModule(); sam.SessionSecurityTokenReceived += new EventHandler(sam_SessionSecurityTokenReceived); 

(sam是用类范围定义的。)

我不确定这是否正确。 我不知道如何validation是否因为global.asax中的调试问题而调用了该事件。

是否有更完整的例子来说明如何捕获此事件? 我是以正确的方式去做的吗?

TIA! 我很感激帮助! 丰富

编辑 – 好吧,我知道事件没有被调用,因为我在处理程序中除了零代码,并且应用程序没有抛出exception。 我通过我的STS登录,因此任何令牌收到的事件都应该被解雇。

任何有关如何做到这一点的帮助将不胜感激。 谢谢!

由于WIF仅允许固定长度的会话,因此需要重新发布安全令牌,此时您可以将令牌的令牌IsValidTo属性设置为您需要的任何内容。

把它放在你的global.asax文件中:

 protected void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e) { var sessionToken = e.SessionToken; SymmetricSecurityKey symmetricSecurityKey = null; if (sessionToken.SecurityKeys != null) symmetricSecurityKey = sessionToken.SecurityKeys.OfType().FirstOrDefault(); Condition.Requires(symmetricSecurityKey, "symmetricSecurityKey").IsNotNull(); if (sessionToken.ValidTo > DateTime.UtcNow) { var slidingExpiration = sessionToken.ValidTo - sessionToken.ValidFrom; e.SessionToken = new SessionSecurityToken( sessionToken.ClaimsPrincipal, sessionToken.ContextId, sessionToken.Context, sessionToken.EndpointId, slidingExpiration, symmetricSecurityKey); e.ReissueCookie = true; } else { var sessionAuthenticationModule = (SessionAuthenticationModule) sender; sessionAuthenticationModule.DeleteSessionTokenCookie(); e.Cancel = true; } } 

资料来源: http : //blogs.planbsoftware.co.nz/?p = 521 1

虽然bmeredith的答案看起来非常有效,但有一点是值得注意的。

看起来每次请求都会更新令牌,加密操作通常并不便宜。 我发现了一种类似但略有不同的方法,只有在会话过半时才更新令牌。

我也喜欢使用SessionAuthenticationModule来创建令牌,所以我们不必乱用密钥。

http://www.cloudidentity.com/blog/2013/05/08/sliding-sessions-for-wif-4-5/

 void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, System.IdentityModel.Services.SessionSecurityTokenReceivedEventArgs e) { DateTime now = DateTime.UtcNow; SessionSecurityToken sst = e.SessionToken; DateTime validFrom = sst.ValidFrom; DateTime validTo = sst.ValidTo; if ((now < validTo) && (now > validFrom.AddMinutes( (validTo.Minute - validFrom.Minute) / 2)) ) { SessionAuthenticationModule sam = sender as SessionAuthenticationModule; e.SessionToken = sam.CreateSessionSecurityToken(sst.ClaimsPrincipal, sst.Context, now, now.AddMinutes(2), sst.IsPersistent); e.ReissueCookie = true; } }