IIS 7 Windows身份验证错误用户

IIS 7 Windows身份验证错误用户

IIS 7,集成应用程序池,身份设置为 NetworkService

我们最近将 asp.net MVC 3 移至我们的生产环境。该应用程序使用 Windows 身份验证。生产环境设置在 IIS 7 上的 Web 场中,运行 Win 2008(不确定是否是 R2)。配置了两台服务器来运行 Web 应用程序。

我们曾两次(大约相隔一周)遇到用户被认证为不同于他们自己的用户的情况。检查 IIS 日志,似乎在某个时间点之后,所有请求都被认证为一个特定用户。日志中还有 X-ARR-LOG 条目,这显然是应用程序请求路由模块(不确定是否相关,但更多信息可能会有帮助...)。我的网络背景不是很强,但我们的网络资源一直找不到这个问题。

我们可以运行哪些诊断工具来查看问题可能出在哪里?Web 场上的某些配置是否可能导致此问题?

一个重要因素是,在 IIS 日志中,有对不经过 asp.net 管道的纯 html 页面的请求,并且在日志中该条目​​是在上述用户下请求的。因此,似乎在问题出现后,所有请求似乎都在同一个用户帐户下进行身份验证。

感谢您提供的任何帮助或提示

更新:

详细说明我们如何确定不同的用户是否作为一个用户进行身份验证......

在 IIS 日志中,我们查看了 cs-username 列,根据文档,该列由 IIS 设置。我们可以看到来自不同 IP、不同位置的不同请求具有相同的 cs-username。在日志中,所有请求都有不同的 cs-username,直到突然之间,所有请求都来自相同的 cs-username。我们已经能够通过将服务器从服务器场中取出并回收应用程序池来重置此问题。不确定这两个中的哪一个具体帮助我们“重置”了问题。还提到一些请求是针对纯 html 页面的,不经过 asp.net 管道(相信它是由监控工具使用的,因为它被称为 sitecheck.html),并且这些请求突然具有相同的 cs-username。此外,应用程序本身使用 WindowsIdentity 来显示用户特定数据,这促使我们更深入地研究该问题...

答案1

https://stackoverflow.com/questions/7410473/asp-net-application-iis7-sessionstate-is-crossing-over-multiple-users-in-differe

http://xprog.blogspot.com/2011/03/iis7-sessions-getting-crossed-mixed-up.html

IIS7 的会话问题
http://forums.iis.net/t/1154347.aspx

IIS7 会话交叉/混淆/复制
http://lionsden.co.il/codeden/?p=446

症状

用户报告称,登录帐户时看到了不属于自己的数据。日志显示,近 10% 的用户被分配了其他用户会话的副本。整个会话对象都被复制,包括会话变量和会话 ID。一旦复制,就可以修改单个会话而不会影响其他会话(即放弃一个会话不会终止另一个会话)。

为了发现问题实例,我将 Request.RemoteHost(发出请求的计算机的 IP 地址)存储在会话变量中。在每个请求开始时,我都会检查以确保会话的 IP 与当前请求的 IP 匹配。

不存在

IP 可能会自然改变,最简单的情况是用户重置路由器/调制解调器。但事实并非如此,因为这种情况发生得太频繁了。此外,已经证实一个用户的数据与另一个用户的数据交叉。最后,一些 IP 对不仅位于不同的计算机上,而且位于不同的国家/地区。

还可能存在这样的情况,而且经常有人提出,如果会话变量与 WebApp 中的静态/共享变量一起使用,则它们可能不再具有唯一性。但事实并非如此,因为我存储在会话中的 IP 地址只从请求中写入一次,之后只读取一次以与请求进行比较。这也被排除了,因为 SessionID 也是重复的,而且是只读值。

过去是什么

这是 IIS7 中的一个功能/错误。最新版本的 IIS 引入了一些新的缓存功能。

IIS7 自动缓存静态内容,例如 HTML 页面、图像和样式表。IIS7
现在还具有缓存动态内容的功能。

如果是动态生成的图片库之类的页面,或者根据浏览器的文化动态生成的页面,那么缓存动态内容是很好的。但是,在这个线程中,http://forums.iis.net/t/1154347.aspxIIS Core 高级软件设计工程师 Anil Ruia 解释道,“您不应该为任何依赖于会话状态的响应启用输出缓存。”

如果生成内容的页面依赖于会话状态,它会将会话对象与页面的其余部分一起缓存。下一个访问的用户最终会拉取缓存的会话,而不是获取新的会话。当我检查我们的设置时,我发现它被设置为缓存所有 .aspx 页面三分钟,包括访问会话的许多页面。

解决方案

编辑缓存规则

在 IIS7 中,禁用任何目录中具有依赖于会话状态的 asp.net 页面的 .aspx 页面的缓存。具体操作如下:

Run the Server Management console.
Navigate to Roles -> Web Server (IIS) -> Internet Information Services.
Select the site you wish to modify.
Select the folder that contains the .aspx pages you need to turn caching off for.
In the Feature View, double-click “Output Caching”.
If there is a rule there already for the .aspx extension double click it. Otherwise right click and select “Add…”
Enter .aspx for the “File name extension”
Check “User-mode caching”
Select “Prevent all caching”
Check “Kernel-mode caching”
Select “Prevent all caching”
Click OK
Close the Server management Console

相关内容