具有 Windows 身份验证的 IIS 7.5 Web 应用程序是不是要求最终用户具有文件权限?

Posted

技术标签:

【中文标题】具有 Windows 身份验证的 IIS 7.5 Web 应用程序是不是要求最终用户具有文件权限?【英文标题】:Does an IIS 7.5 web app with windows authentication require end users to have file permissions?具有 Windows 身份验证的 IIS 7.5 Web 应用程序是否要求最终用户具有文件权限? 【发布时间】: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 -iaspnet_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) 是的,只是为了尝试特定的应用程序池用户帐户而不是网络服务。 我遇到了完全相同的问题,而且只有一台机器。这很混乱。 【参考方案1】:

简短的回答是否定的。在 IIS 7.0 和 IIS 7.5 中使用 Windows 身份验证时,您不需要授予文件访问权限。

我们之所以能够发现这一点,是因为我们的服务器管理员发现了向用户和组授予文件级别访问权限的途径所产生的安全和管理问题。

对于处理此问题的任何人,或者如果您正在设置新的 IIS7/IIS7.5 服务器和/或从 IIS 6 迁移,这里有一篇文章为您提供了所有需要的 Windows 身份验证选项和配置修改以避免授予个人或组文件级访问权限。

请阅读 POST 末尾的两个 cmets,了解对本文中使用的方法的一些有效批评。

http://weblogs.asp.net/owscott/iis-using-windows-authentication-with-minimal-permissions-granted-to-disk

除了文章中的信息,请注意 IIS 7.5 没有使用 system.web 的 web 配置标签(至少在我的 MVC 4 应用程序中没有)。

它在 system.webserver 标记中查找授权配置(您需要在其中列出用户访问您的应用程序所需的 Windows 域\组)。

-- DSB

【讨论】:

【参考方案2】:

我们也在与这个问题作斗争,并开始设置安全组,以便我们可以为用户提供文件级权限。然后,我们的一位服务器管理员偶然发现了几个新属性,这些属性允许应用程序在设置的凭据下对文件系统进行身份验证,并解决了用户访问权限的需要。这是他想出的……

有两个 IIS 设置可以控制这一点:

物理路径凭据物理路径凭据登录类型

默认情况下,物理路径凭据设置为应用程序用户 (直通身份验证)。这意味着 IIS 不执行任何操作 处理 Windows 身份验证请求时的模拟。这个可以, 但是,设置为特定用户(但不幸的是,不是 应用程序池标识,这将是理想的)。物理路径 凭据登录类型默认设置为明文。对于我的测试 我将其设置为 Interactive(尽管这可能不是正确的值)。 可能的值是 Clear-Text、Batch、Interactive 和 Network。

为了进行设置,我做了以下操作:

    已创建本地帐户 (IIS-AccessUser) 授予 IIS-AccessUser 对站点 /home 目录的读取和执行权限。 将 IIS-AccessUser 添加到 IIS_IUSRS 组(访问 .NET 临时文件所必需的) 将 IIS-AccessUser 设置为物理路径凭据 将物理路径凭据登录类型设置为交互式

执行上述操作后,我可以直接登录应用程序, 无需允许经过身份验证的用户,或者我必须是 /home 文件夹中任何组的成员。它还 保留 .NET 授权角色,所以我仍然无法访问部件 我被禁止访问的网站。

【讨论】:

谢谢,这很好。对我来说设置太多,所以我现在确保 AuthenticatedUsers 可以访问,但如果真的关心确保用户无法通过 Windows 资源管理器访问文件,这将是前进的方向。 为什么不能设置为应用池身份?这似乎对我有用。 @DZx 我自己从未见过配置屏幕,但我怀疑我们的管理员在感叹没有简单的选项说“使用应用程序池身份”。但是,我不知道有什么可以阻止您将相同的凭据键入两个位置。 @DZx 我尝试在 IIS 7.5 中为“物理路径凭据”设置应用程序池标识,但它只提供两个选项:“特定用户”和“应用程序用户(直通)验证)”。我尝试将“特定用户”选项与我的“IIS AppPOOL\”一起使用,密码为空(因为它是一个 IIS 内置帐户)。 IIS 错误“指定的密码无效[...]”。我认为这就是为 Rozwel 创建 IIS-AccessUser 的原因。你是怎么做到的? 这里有一组更好的选项:weblogs.asp.net/owscott/…【参考方案3】:

是否允许经过身份验证的用户访问应用文件夹?

【讨论】:

我以前从未见过该组,也不需要授予它权限!这不是和授予Everyone权限基本一样吗? 简而言之“不”,您可能想阅读这篇文章windowsitpro.com/article/user-management-and-profiles/… 好的,它与Everyone 不同相同,因为Everyone 包括Guest 和空会话,例如计算机到计算机的连接。但是经过身份验证的用户是几乎所有人,因此您仍然必须向最终用户授予文件访问权限,这是我试图避免的。 windowsitpro.com/article/file-systems/… 有更多关于 Authenticated Users 的讨论。 您没有使用 Active Directory 吗?您不想授予活动目录用户访问权限吗?也许我完全错了...... 那篇文章是关于使用表单身份验证向用户呈现登录表单,然后对域进行身份验证。我想使用 Windows 身份验证来自动对用户进行身份验证。我没有使用模拟,所以我没有 impersonate="true";我希望应用程序池作为网络服务运行,而不是作为经过身份验证的最终用户。

以上是关于具有 Windows 身份验证的 IIS 7.5 Web 应用程序是不是要求最终用户具有文件权限?的主要内容,如果未能解决你的问题,请参考以下文章

IIS 7.5 Windows 身份验证失败,除非代码文件共享给最终用户

iis 7.5 dns windows身份验证页面用户身份不起作用

使用 Silverlight 5、IIS 7.5 对 WCF 服务进行 Windows 身份验证

使用 Powershell 3.0 切换 IIS 7.5 身份验证“匿名身份验证”?

MVC 5 IIS 7.5 双跳问题(避免硬编码 SQL 密码)

使用 IIS 7.5 进行表单身份验证 - 未授权