Authentication 滑动会话重新验证
我已经在依赖方应用程序中实现了滑动会话,如中所述。就目前而言,这很有效,但有一个问题似乎没有人谈论 正如链接的博客文章所指出的,当RP令牌过期时,下次发出请求时,该令牌将从STS重新发出。当然,假设STS会话生存期比RP的会话生存期长,如果您正在实现滑动会话,几乎可以肯定这一点 无论如何,这完全违背了滑动会话的全部要点 似乎没有人谈论RP会话到期时该怎么办。我想要的是,如果RP会话超时(通常是因为有人离开他的办公桌10分钟),我的应用程序将重定向到STS登录页面,在那里用户可以重新验证,然后重定向回我请求的页面;或者是我提出请求时的页面 我几乎可以肯定这是可能的,但我完全不知道这是怎么做到的 以下是我从global.asax获得的代码:Authentication 滑动会话重新验证,authentication,wif,thinktecture-ident-server,Authentication,Wif,Thinktecture Ident Server,我已经在依赖方应用程序中实现了滑动会话,如中所述。就目前而言,这很有效,但有一个问题似乎没有人谈论 正如链接的博客文章所指出的,当RP令牌过期时,下次发出请求时,该令牌将从STS重新发出。当然,假设STS会话生存期比RP的会话生存期长,如果您正在实现滑动会话,几乎可以肯定这一点 无论如何,这完全违背了滑动会话的全部要点 似乎没有人谈论RP会话到期时该怎么办。我想要的是,如果RP会话超时(通常是因为有人离开他的办公桌10分钟),我的应用程序将重定向到STS登录页面,在那里用户可以重新验证,然后重定
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
子句是否是放置重新验证逻辑的适当位置我建议您同步STS和RP上的会话生存时间 您可以在STS上将会话生存时间设置为10分钟,在RP上将会话生存时间设置为10分钟,并在RP上使用滑动会话方法。在10分钟不活动后,两个会话都将过期,并且应要求用户重新验证 如果您有多个RPs,您可以实现从RP到STS的保持活动形式-例如,在RPs上的每个网页中从STS加载资源。无论何时在RP上加载页面,都会从STS加载保持活动的资源—刷新STS会话。10分钟不活动后,它们都将超时,用户必须重新验证 “来自STS的资源”可能意味着加载在不可见iframe中的网页(web表单/MVC)。重要的是,它是一个托管处理程序,因此请求由ASP.NET处理 对于您的问题,如果您同步会话生命周期,使它们一起超时:
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。