如何在使用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登录的,所以任何接收到的令牌事件都应该被触发。

任何关于如何做到这一点的帮助将非常感激。谢谢!

如何在使用STS (WIF)进行身份验证的MVC应用程序中设置滑动过期

由于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; 
    }
}