ADFS会话过期并导致错误

zim*_*nen 7 ajax adfs

我们将ADFS用于内部应用程序 - 用户在访问我们的应用程序时,基本上都可以透明地登录.但是,如果用户将页面打开超过一个小时然后尝试在该页面上执行某些操作(除了导航到另一个页面),则会出现错误:

此页面正在访问不受其控制的信息.这带来了安全风险.你想继续吗?

看起来该页面正在尝试将该请求重定向到ADFS服务器,并且浏览器正在阻止该请求.

我的问题是:我如何捕获这种情况并让用户到ADFS服务器重新进行身份验证?

我没有幸运在谷歌上发现任何关于此的事情.

fri*_*gle 1

您可以在 global.asax 中手动检查和重新颁发安全令牌,并使用它来创建滑动会话。通过滑动会话,您可以选择推迟重新身份验证,直到“安全”为止(此时数据将不再因 ADFS 重定向而丢失)。

在 SessionSecurityTokenReceived 事件内,您可以评估令牌和请求。如果令牌已过期并且请求会因重定向而丢失数据,则您可以重新颁发新的“临时”令牌。新令牌的寿命应该很短,只要足够长就可以安全地完成当前请求。然后,令牌将过期并在下一个请求时再次评估。

protected void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e)
{
    var now = DateTime.UtcNow;
    SessionSecurityToken token = e.SessionToken;
    var httpContext = new HttpContextWrapper(this.Context);

   if (now > token.ValidTo
       && (httpContext.Request.IsAjaxRequest() || httpContext.Request.HttpMethod == "POST"))
   {
       var sessionAuthModule = (SessionAuthenticationModule)sender;
       e.SessionToken = sessionAuthModule.CreateSessionSecurityToken(token.ClaimsPrincipal,
                                                                     token.Context,
                                                                     now,
                                                                     now.AddMinutes(2),
                                                                     token.IsPersistent);
       e.ReissueCookie = true;
   }
}
Run Code Online (Sandbox Code Playgroud)

ADFS 会话将继续推迟重新身份验证,直到下一个 GET 请求。然后重定向最终会发生,并且用户将获得正常生命周期的适当令牌。