0

我在胡思乱想。我正在尝试在同一应用程序池下运行并使用 .Net 4 的两个应用程序之间使用相同的 SessionState mode="StateServer"。我对这两个应用程序都进行了测试,结果很奇怪:SessionID is shared,但不是实际的 session items

它在内部是如何工作的?这是某处记录的安全限制吗?

屏幕截图 1 - 我在 app#1 /SecureSessionTest.aspx 中设置了一个会话项目( TestData中的一个简单日期): 在此处输入图像描述

屏幕截图 2 - 我正在 app#2 /Apps/SecureSessionTest.aspx 中读取相同的会话项TestData,但仅显示 SessionID: 截图 1:SessionID 是共享的,但不是项目 TestData

我什至可以在同一个Session("key"). 诡异的!

他们的 web.config 中都有这个:

<machineKey validationKey='7D1094A0FC13B6656141916F69F6E25D0F112A6E94BD3EF5DAEFD9755A367C09607E7D76827AC5ACAD14456665C4E0966F632F09522475758A815A4045BF3F25'   decryptionKey='F0DF9FA0522E541FF246ADD8BC285A10E984444AE4361631' validation='SHA1'/>
<sessionState mode="StateServer" stateConnectionString="tcpip=localhost:42424" timeout="60" regenerateExpiredSessionId="false" cookieName="XXXXXXXX_ASP.NET_SessionId" />

有任何想法吗?非常感谢帮助!

卡尔

4

2 回答 2

1

StateServer 使用 SessionID cookie、机器密钥和应用程序名称的组合来关闭会话。

尝试让两个应用程序共享同一个应用程序池。

这个先前的问题可能很有启发性: 会话状态和应用程序池

(如果我最初的建议不起作用,请发表评论,我会更深入地挖掘)

于 2011-08-02T02:40:35.123 回答
0

@Ash 是对的,会话基于 sessionID(取决于机器密钥以及网站域)和应用程序名称,但我确实让它在跨应用程序目录的单个站点上工作(听起来像你的场景) - 查看我在状态服务器会话上的答案 - 跨 appDomain?

听起来您缺少的部分是在 global.asax 中显式设置应用程序名称(使用反射-我还没有找到此配置设置)。我整个早上都在谷歌搜索设置后才发现这一点。

于 2012-12-14T16:38:53.343 回答