asp.net - 为什么 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 中的应用程序池设置:空闲超时和回收设置对我来说都很好。
更新:
我已经设法通过等待 30 分钟来复制该问题,然后返回并刷新页面,并将得到由
Page.PreviousPage
is引起的异常null
。看起来超时是由
Owin
使用 Cookie 身份验证的代码引起的。看起来与 AD FS 令牌过期有关,请参阅我收集的证据的答案。
解决方案
我认为这是因为我们用于身份验证的 ADFS 令牌已过期,在它过期后,我们的网站将请求另一个令牌,并且在重新身份验证过程中从 ADFS 服务器重定向后,PreviousPage
它丢失了,因为它本质上是重新-direct 而不是服务器传输。
TokenLifeTime
我可以通过查看ADFS 服务器上的 by execute power shell来确认这一点:
Get-AdfsRelyingPartyTrust -Name "relying_party"
显然0
意味着60分钟。
而且我还设法通过 ADFS 服务器的令牌响应捕获 Fiddler 会话:
<wsu:Expires xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2020-04-21T01:50:36.830Z</wsu:Expires>
这是创建令牌后一小时。
我什至使用以下方法将时间减少TokentLifetime
到 5 分钟或其他东西:
Set-ADFSRelyingPartyTrust -Targetname "relying_party" -TokenLifetime 5
这将按预期将超时会话减少到 5 分钟。
但我仍然无法 100% 地复制问题。
更新:我后来找到了这个链接:所以 ADFS 服务器上的三个超时设置可能会影响我遇到的超时
推荐阅读
- r - 对象大小的不同结果?
- laravel - 不能在 Laravel 控制器上使用 eloquent ::query()
- bash - 根据 bash 脚本中的名称有选择地创建文件夹
- c - 为什么结构在 64 位机器上与 4 字节(32 位)对齐?
- c# - 如何只打开一次第二个表单
- visual-studio - SSRS - RDL 不保存在项目中,必须每次添加
- java - Simple.json 提取浮点数
- java - 为 /events URL upvotes 执行 POST 时收到错误“无法构造实例”消息
- c++ - 'MyVector 类型的非常量引用的无效初始化
&' 来自“MyVector”类型的右值 ' - html - 将 localhost URL 添加到 CSP 的允许列表以进行本地开发是否安全?