我已经在依赖方应用程序中实现了滑动会话,如中所述WIF 4.5 的滑动会话 http://www.cloudidentity.com/blog/2013/05/08/sliding-sessions-for-wif-4-5/。就目前而言,这很有效,但有一个问题似乎没有人谈论。
正如链接的博客文章指出的那样,当 RP 令牌过期时,下次发出请求时,将从 STS 重新颁发令牌。当然,假设 STS 会话生命周期比 RP 会话生命周期长,如果您正在实现滑动会话,则几乎肯定会出现这种情况。
无论如何,这完全违背了滑动会话的全部意义。
似乎没有人讨论 RP 会话过期后该怎么办。我什么want是,如果 RP 会话超时(通常是因为有人离开办公桌 10 分钟),我的应用程序将重定向到 STS 登录页面,用户可以在其中重新进行身份验证,然后重定向回我的页面已请求;或者也许是我提出请求时所在的页面。
我几乎确信这是可能的,但我完全不知道它是如何完成的。
这是我的 global.asax 代码:
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
}
}
我的问题:
- Is the
else
子句放置重新验证逻辑的正确位置?
- 如果是这样,请提供一个例子,因为我不知道。
- 如果#1 的答案是否定的,那么我是否需要订阅一个单独的事件来告诉我“嘿,您的会话安全令牌已过期!”?
我建议您同步 STS 和 RP 上的会话生命周期。
您可以在STS上将会话生存时间设置为10分钟,在RP上将会话生存时间设置为10分钟,并在RP上使用滑动会话方式。 10 分钟不活动后,两个会话都将过期,并且应要求用户重新进行身份验证。
如果您有多个 RP,您可以实现从 RP 到 STS 的一种保持活动状态 - 例如在 RP 上的每个网页中加载来自 STS 的资源。每当在 RP 上加载页面时,都会从 STS 加载保持活动资源 - 刷新 STS 会话。 10 分钟不活动后,它们都会超时,用户必须重新进行身份验证。
“来自 STS 的资源”可能意味着在不可见的 iframe 中加载的网页(Web 表单/MVC)。重要的是它是一个托管处理程序,因此请求由 ASP.NET 处理。
至于您的问题,如果您同步会话生命周期,以便它们一起超时:
- 不,您不需要在 else 子句中添加任何代码。如果令牌过期,WIF 将重定向到 STS。
- 只需删除 else 子句即可。
- 让 WIF 为您处理这件事。
为了完整起见,如果您无法同步会话生命周期,则可以在 RP 会话过期时触发联合注销。以下代码片段会在配置的发行者 (STS) 处触发注销。您可以将其放在 else 子句中,以在 RP 会话过期后触发第一个请求的注销:
using System.IdentityModel.Services; //WIF 4.5
var stsAddress = new Uri(FederatedAuthentication.FederationConfiguration.WsFederationConfiguration.Issuer);
WSFederationAuthenticationModule.FederatedSignOut(stsAddress, null); //Optional replyUrl set to null
希望有帮助!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)