【发布时间】:2012-12-16 17:49:11
【问题描述】:
短版:
对于带有 Windows 身份验证的 IIS 7.5 Web 应用程序,结束 用户需要有读取文件的权限吗?
长版:
我有一个使用 Windows 身份验证的 Intranet ASP.NET Web 应用程序。它安装在数十家不同的公司中,并且通常身份验证工作正常:用户导航到该站点,例如http://appserver/MyApp,该应用程序可以识别他们的登录身份并相应地显示页面。刚在新客户端安装,遇到问题:
连接时,例如到http://appserver/MyApp 我被提示输入 Windows 凭据,但在输入它们后,我被反复提示。在多次重新输入凭据后,我看到一个 401 错误页面,上面写着“401 - 未经授权:由于凭据无效,访问被拒绝。”。因此,它不仅没有通过我的身份,而且即使输入用户名和密码,它仍然拒绝访问。
向应用程序的最终用户授予读取和执行权限可以解决此问题,但我认为这根本没有必要。
在 Windows 应用程序事件日志中有一条消息“请求的文件授权失败”以及线程帐户名称:NT AUTHORITY\NETWORK SERVICE 和用户:[正确的工作站用户的域帐户]。这表明文件访问是使用用户身份执行的,而不是网络服务的 AppPool 身份。果然,如果我授予最终用户对应用程序目录的读取和执行权限(我没有尝试只读),那么一切正常:当用户浏览到该站点时,他们会自动进行身份验证,而不是提示,并且网站正确识别自己的身份!因此,我的解决方案是在应用程序目录中向所有人授予读取和执行权限......但这不是一个理想的解决方案。
这看起来很奇怪。据我记得,我以前在 IIS 7.5 中从来不需要这样做,而且在 IIS 6 或 IIS 7 中绝对不需要这样做。这是 IIS7.5 的新事物吗?文档说默认情况下模拟是关闭的。我在 web.config 中添加了一个元素以确保删除了网络服务以外的文件权限,但问题仍然存在。
有什么想法吗?对于 IIS 7.5 上的 Windows Authenticated 站点,最终用户需要对 Web 服务器文件的文件权限是否正常?
一些相关细节:
- 网络服务 对应用文件夹具有完全控制文件权限。
- 从服务器本身连接时,系统提示我输入凭据
但是在输入它们后,我已通过身份验证并且应用程序可以正常工作
正确包括显示我的 Windows 登录和连接
从数据库中检索数据。后来我确定是在提示
用于凭据,因为
http://localhost在受信任的站点中 因此不被识别为 Intranet 区域,因此不 传递身份。我还确定它的工作原理是 此用户身份,因为它是拥有文件的管理员用户 权限。 - Web 服务器正在运行 Windows Server 2008 R2 / IIS 7.5。在我安装它之前,它上面没有 IIS。我安装了默认功能以及 Windows 身份验证、ASP.NET 和 可能还有其他几个项目。我安装了一个单独的 WCF 应用程序 使用 IIS,匿名身份验证和 .net 2.0 运行良好 那个网络服务器。
- 应用程序安装过程是文件的手动副本, 创建 IIS 应用程序池和 Web 应用程序,更新连接字符串, 等等。
- 我检查了 IE 安全设置。它认识到 服务器在 Intranet 区域中,并具有“自动登录”选项 仅在 Intranet 区域中选择。同样在高级设置 “启用集成 Windows 身份验证”选项已选中。
- 之后
安装 IIS 我为 .net 2.0 运行了
aspnet_regiis -i和aspnet_regiis -iru用于 .net 4.0。 - 匿名身份验证是 为我的应用禁用并启用 Windows 身份验证。
- 应用程序是 在 ASP.NET v4 上运行,但我安装了另一个应用程序 在运行 ASP.NET v2 时遇到同样的问题。
- 应用程序正在运行 身份 = 网络服务和 32 位模式。
- 数据库
连接字符串包括
Trusted Connection=True和数据库 权限已授予 Web 服务器帐户[domain]\[server]$例如DGM\MyServer$。 - 在 IIS > 身份验证 > Windows 身份验证 > 提供程序中,列表首先是协商,然后是 NTLM。我尝试重新排序,所以 NTLM 是第一位的。
- 在 Windows 安全事件日志中 是一系列 Microsoft Windows 安全审核事件:登录 和注销。他们表示登录成功并且 显示工作站用户的用户 ID。这是从什么时候 我正在从另一个工作站连接并收到 401 多次尝试后未授权。
我看到有人遇到过这个问题reported here,但没有解决方案。最初我在ASP 和IIS 论坛上发帖,至今没有任何答案。
更新: This msdn article 说
当启用 Windows 身份验证但禁用模拟时,ASP.NET 在file authorization 模块中执行文件访问检查使用从浏览器发送的凭据 (我的重点)。不需要启用模拟,因为 FileAuthorizationModule 模块确保请求用户被允许对资源进行读取访问或写入访问,具体取决于执行请求之前的请求动词(例如,GET 或 POST)。此行为适用于输入托管代码的任何请求。在早期版本的 ASP.NET 中,访问基于诸如“Default.aspx”之类的 URI 的文件会触发访问检查。在 ASP.NET MVC 应用程序中,通常使用无扩展名 URL 执行对资源的访问,此检查通常不适用,因为没有要检查的物理文件。在这种情况下,FileAuthorizationModule 类回退到检查文件夹的访问控制列表 (ACL)。
这确实表明最终用户需要对文件(在 .aspx 的情况下)或文件夹(对于 MVC)的权限......尽管这似乎仍然有些隐蔽且不确定。 This article about App Pools 表示它们被用作保护资源的身份,这与需要向最终用户授予权限的想法相矛盾。除非应用程序池和网络服务的规则不同,否则可能会出现这种情况,但会令人惊讶。
【问题讨论】:
-
两个问题: 1. appserver 是否连接到域,以便 NTLM 能够解析域控制器中的凭据? 2、如果创建本地appserver账号,将应用池切换到这个本地账号(而不是网络服务),问题是否依然存在?
-
1) 是的,appserver 能够连接到域。在 Windows 安全事件日志中有一系列 Microsoft Windows 安全审核事件:登录和注销。他们表示登录成功,使用 NTLM 或 Kerberos,具体取决于提供者列表顶部的哪个。
-
2) 你的意思是在本地机器上创建一个新用户并使用它,而不是说使用 AppPool 身份?我可以试一试......你认为这可能有效的任何理由?
-
2) 是的,只是为了尝试特定的应用程序池用户帐户而不是网络服务。
-
我遇到了完全相同的问题,而且只有一台机器。这很混乱。
标签: asp.net iis iis-7.5 windows-authentication