如何在使用STS (WIF)进行身份验证的MVC应用程序中设置滑动过期
本文关键字:应用程序 MVC 身份验证 设置 过期 STS WIF | 更新日期: 2023-09-27 17:53:49
我们正在使用STS开发一个MVC应用程序。我们使用WIF工具创建了一个简单的STS应用程序进行开发。
我希望能够在我的令牌中设置滑动过期(在RP中)。
我看到像这样的代码。
不幸的是,这是事件处理程序和示例,虽然有帮助,但没有显示如何实现处理程序!
在我的全局。asax, Application_Start()我有:
sam = new SessionAuthenticationModule();
sam.SessionSecurityTokenReceived +=
new EventHandler<SessionSecurityTokenReceivedEventArgs>(sam_SessionSecurityTokenReceived);
(sam是用类作用域定义的)
我不确定这是否正确。我不知道如何验证如果事件被调用,因为调试问题在global.asax。
是否有一个更完整的例子来说明如何捕获这个事件?我的方法对吗?
TIA !谢谢你的帮助!丰富的
编辑-好吧,我知道事件没有被调用,因为我把除零代码在处理程序和应用程序没有抛出异常。我是通过我的STS登录的,所以任何接收到的令牌事件都应该被触发。
任何关于如何做到这一点的帮助将非常感激。谢谢!
由于WIF只允许固定长度的会话,因此它需要重新颁发安全令牌,此时您可以将令牌的令牌IsValidTo属性设置为所需的任何内容。
把它放到全局变量中。asax文件:
protected void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e)
{
var sessionToken = e.SessionToken;
SymmetricSecurityKey symmetricSecurityKey = null;
if (sessionToken.SecurityKeys != null)
symmetricSecurityKey = sessionToken.SecurityKeys.OfType<SymmetricSecurityKey>().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=5211
虽然meredith的答案看起来完全正确,但有一件事很突出。
看起来令牌在每次请求时都会更新,加密操作通常并不便宜。我发现了一种类似但略有不同的方法,仅在会话已经过一半时更新令牌。
我还喜欢使用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;
}
}