【发布时间】:2017-07-14 21:34:12
【问题描述】:
我已经在这些元素上苦苦挣扎了大约 2 个月。
当我的 MVC4 应用程序回收时出现了第一个问题。当前登录的用户突然无法访问任何标记为 [Authorize] 的控制器操作。此外,任何对需要数据库连接的控制器操作的成功访问都会产生此错误:
无法打开用户默认数据库。登录失败。用户登录失败 'IIS APPPOOL\DefaultAppPool'。
这很奇怪,因为如果我清除我的身份验证 cookie,它就可以正常工作。所以 ASPXAUTH 和 .ASPNET_SessionId cookie 存在问题。
后来我发现这些错误是由服务器重新启动或回收后会话失效引起的。我的会话设置处于 InProc 模式。这意味着每次服务器重新启动或回收时会话都会丢失。
然后我将我的会话配置更改为 Custom Session SQLStore 中描述的
https://msdn.microsoft.com/en-us/library/ms178588.aspx
和
https://msdn.microsoft.com/en-us/library/ms178589.aspx
目的是将会话数据存储在SQLServer中,但问题似乎并没有消失。重启或回收服务器后,当前登录的用户访问控制器操作仍有问题。
我的想法是 SimpleMembership 没有将登录会话存储在数据库中。这就是我登录的方式:
WebSecurity.Login(userName, model.Password, persistCookie: true)
如果我是正确的,系统将尝试将 身份验证 cookie 与 登录会话数据 匹配,并确定身份验证是否仍然有效。这就是为什么我的用户一直有这个问题,因为会话和 cookie 之间的匹配会产生一些奇怪的东西。
过去两个月我做了很多研究,我发现了很多与我类似的问题,但我没有找到合适的解决方案。
我使用的临时解决方案是在服务器被回收或重新启动时注销用户。这不是一个好的解决方案,因为如果用户正在进行重要的交易或提交,数据可能会丢失,用户会被重新重定向到登录页面。
更新
我有我的机器密钥集:
<machineKey validationKey="685DD0E54A38F97FACF4CA27F54D3DA491AB40FE6941110A5A2BA2BC7DDE7411965D45A1E571B7B9283A0D0B382D35A0840B46EDBCE8E05DCE74DE5A37D7A5B3"
decryptionKey="15653D093ED55032EA6EDDBFD63E4AAA479E79038C0F800561DD2CC4597FBC9E"
validation="SHA1" decryption="AES" />
我尝试调试我的自定义 SQL 会话存储,我发现数据库中没有存储身份验证会话。我只能找到从我的 SQL 会话中检索到的 "__ControllerTempData",没有别的。
如果我错了,请纠正我,网站重用身份验证 cookie 并验证它的方式是通过比较身份验证 cookie 和身份验证会话,对吗?
显然,SimpleMembership Login() 不会将身份验证会话存储到 SQL 状态服务器中。
那么使用哪个会话密钥进行比较?
【问题讨论】:
-
我真的希望那不是你真正的机器钥匙。如果是,请立即更改。
-
“内置”成员资格提供程序都不会在会话中存储任何内容。用户名存储在 authtoken(身份验证 cookie)中,然后在每个新请求期间重新创建主体和身份对象。您是否在会话中手动存储任何用于安全的内容?
-
@TiesonT。您提供的链接不再有效
标签: c# asp.net asp.net-mvc session cookies