首页 > 解决方案 > 为什么 Page.PreviousPage 超时,是 sessionState 超时还是别的什么?

问题描述

我试图弄清楚为什么下面的代码null检查失败并在一段时间后抛出异常,我还没有确定超时的原因是什么,我认为这是我收到异常消息的原因,它通常会发生第二天早上或午休后。但我仍然能够可靠地复制问题。

var prePage = Page.PreviousPage as BasePage;

if (prePage != null)
{
   PageSessionField = prePage.PageSessionField;
}
else
{
   throw new Exception("Null previous page session exception.");
}

我的第一个猜测是sessionState超时:

<sessionState cookieless="UseCookies" mode="InProc" timeout="20" useHostingIdentity="false" />

但是我尝试将timeout值更改为例如 minimum number 1,但它通常不会按预期抛出异常。

否则,IIS 中的应用程序池设置:空闲超时和回收设置对我来说都很好。

IIS 应用程序池配置部分

更新:

  1. 我已经设法通过等待 30 分钟来复制该问题,然后返回并刷新页面,并将得到由 Page.PreviousPageis引起的异常null

  2. 看起来超时是由Owin使用 Cookie 身份验证的代码引起的。

  3. 看起来与 AD FS 令牌过期有关,请参阅我收集的证据的答案。

标签: asp.netiisowincookie-authentication

解决方案


我认为这是因为我们用于身份验证的 ADFS 令牌已过期,在它过期后,我们的网站将请求另一个令牌,并且在重新身份验证过程中从 ADFS 服务器重定向后,PreviousPage它丢失了,因为它本质上是重新-direct 而不是服务器传输。

TokenLifeTime我可以通过查看ADFS 服务器上的 by execute power shell来确认这一点:

Get-AdfsRelyingPartyTrust -Name "relying_party"

我得到了这个: 在此处输入图像描述

显然0意味着60分钟。

而且我还设法通过 ADFS 服务器的令牌响应捕获 Fiddler 会话:

&lt;wsu:Expires xmlns:wsu=&quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&quot;>2020-04-21T01:50:36.830Z&lt;/wsu:Expires>

这是创建令牌后一小时。

我什至使用以下方法将时间减少TokentLifetime到 5 分钟或其他东西:

Set-ADFSRelyingPartyTrust -Targetname "relying_party" -TokenLifetime 5

这将按预期将超时会话减少到 5 分钟。

但我仍然无法 100% 地复制问题。

更新:我后来找到了这个链接:所以 ADFS 服务器上的三个超时设置可能会影响我遇到的超时


推荐阅读