IIS - 401.3 - 未经授权

135
我正在尝试使用IIS。我在IIS管理器上创建了一个新站点,将其映射到文件系统上的一个文件夹,并在该文件夹中添加了index.html文件。我将此站点的端口设置为85。当我尝试访问http://localhost:85/index.html时,出现以下错误信息: 401.3 - 未经授权 - 您无权查看此目录或页面,因为Web服务器上的资源的访问控制列表(ACL)配置或加密设置。 我给文件夹中的每个人都分配了读取权限并再次尝试,然后我可以访问该页面。 然后,我将我的文件夹属性与wwwroot的属性进行了比较。我发现wwwroot在IIS_IUSRS上有读取权限。当我在我的文件夹上执行相同操作并再次尝试时,我再次收到了上述错误。 我检查了匿名访问默认已启用,但仍然出现此错误。 为什么会这样?如何正确解决这个问题?
10个回答

244

我曾经在这个问题上苦苦挣扎了好几天。解决方法是修改文件系统文件夹的安全用户权限,该文件夹是您站点映射的位置。但是IIS_IUSRS不是您必须授权的唯一帐户。

  • 在IIS管理控制台中,在站点配置的身份验证部分,修改“匿名身份验证”行并检查设置为“指定用户”的账户(我的是IUSR)。
  • 将站点文件夹的读取和执行权限授权给指定用户列出的账户。

或者

  • 在IIS管理控制台中,在站点配置的身份验证部分,通过选择“应用程序池的标识”而非“指定用户”,来修改“匿名身份验证”行。

10
我发现使用“应用程序池身份”进行匿名身份验证可行,但由于某种原因无法使用IUSR,谢谢。 - fortboise
8
逻辑是默认情况下网站使用匿名身份验证,IUSR 是匿名帐户。因此,IIS 使用 IUSR 帐户访问文件系统(网站物理路径),但这可能并不总是有效的(因为许多文件系统不接受 IUSR)。这就是 401.3 错误的原因。通过更改文件系统访问权限(授予该帐户访问文件)或将匿名帐户更改为池标识(池标识在 IIS_IUSRS 中,通常具有访问文件的权限),IIS 应具有足够的权限来访问文件。 - Lex Li

83

以下是对我有效的解决方案。

  1. 将应用程序池标识设置为可以分配权限到文件夹的帐户。
  2. 确保源目录和所有相关文件对分配给应用程序池标识属性的帐户拥有读取权限。
  3. 在IIS中,在服务器根节点处,将匿名用户设置为继承自应用程序池标识。(这是我挣扎的部分)

按照以下步骤将服务器匿名用户设置为继承自应用程序池标识:

  • 打开IIS管理器 (inetmgr)
  • 在左侧窗格中选择根节点(服务器主机名)
  • 在中间窗格中打开"身份验证"小程序
  • 突出显示“匿名身份验证”
  • 在右侧窗格中选择“编辑…”(应该会打开一个对话框)
  • 选择“应用程序池标识”

11
我解决了我的问题: 在IIS中,在服务器根节点,将匿名用户设置为继承应用程序池标识。(这是我困扰的部分) - Ravi Ram
2
我知道写“谢谢”评论是不太合适的,但我觉得我需要表达我的感激之情。如果没有你,我绝对想不出如何解决这个问题。 - Jonny Cook
@RaviRam:请解释一下你所遵循的步骤。作为一个初学者,逐步说明。你所说的“在IIS中,在服务器根节点中,将匿名用户设置为从应用程序池标识继承”的意思是什么?请帮忙解答。 - Unbreakable
@RaviRam - 运行命令“inetmgr.exe”,将出现IIS管理屏幕。从这里,按照我的答案中概述的步骤进行操作。您可能需要以管理员身份运行该命令。https://msdn.microsoft.com/en-us/library/bb763170.aspx - barrypicker
正如另一个答案中提到的,我发现您不必更改根级别的匿名身份验证设置 - 您也可以在站点或虚拟目录级别更改该设置。 - jaycer
1
另一个我希望能够多次点赞的答案,因为每当我遇到相同的问题时(尽管时间间隔很长),我都会多次找到这个答案。 - freefaller

41

TL;DR;

在大多数情况下,授予以下账户(其中之一或两者都可)访问权限即可:

  1. IIS AppPool\DefaultAppPool
  2. IUSR

具有以下访问权限

  1. 读取和执行
  2. 列出文件夹内容
  3. 读取

就是这样!

继续阅读以获得更详细的解释...


  1. 打开IIS并选择您的应用程序
  2. 在右侧点击身份验证
  3. 在此处选择匿名身份验证
  4. 弹出以下对话框。

输入图像描述 here

根据上图所选内容为Web应用程序文件夹的ACL授予权限:

  • 指定用户:为IUSR(在我的情况下) + IIS AppPool\DefaultAppPool授予访问权限。
  • 应用程序池标识:仅为IIS AppPool\DefaultAppPool授予权限。

IIS AppPool\DefaultAppPool账户是新IIS Web应用程序的默认AppPool帐户,如果您设置了自定义帐户,请使用自定义帐户。


将以下权限授予以上账户:

  1. 读取和执行
  2. 列出文件夹内容
  3. 读取

输入图像描述 here


1
6年后,这正是对我有用的评论。 - Guitrum

19

由于您正在处理静态内容...

在充当您网站根目录的文件夹上-如果右键单击>属性>安全性,是否显示"用户"? 如果没有,请单击"添加..."并输入它,确保完成后单击"应用"。



3
  1. 创建一个新站点,在Sites文件夹上右键单击,然后单击添加站点
  2. 输入站点名称。
  3. 选择物理路径
  4. 选择IP地址
  5. 更改端口
  6. 单击“确定”
  7. 转到应用程序池
  8. 选择站点池
  9. 右键单击单击“高级设置”
  10. 将 .Net CLR 版本更改为“无托管代码”
  11. 将身份更改为“ApplicationPoolIdentity”
  12. 转到网站主页,然后单击“身份验证”
  13. 右键单击匿名身份验证,然后单击“编辑”
  14. 选择应用程序池标识
  15. 单击确定
  16. 完成!

要添加路由,请添加web.config文件

<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="React Routes" stopProcessing="true">
                    <match url=".*" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                        <add input="{REQUEST_URI}" pattern="^/(api)" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="/" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

1

如果其他人遇到了这个问题,我希望能帮到你们。我排除了所有故障并发现,由于我从MAC解压缩了一些文件,Microsoft自动加密了这些文件而没有任何通知。经过数小时的尝试设置文件夹权限,我进去看到文件名是绿色的,这意味着文件被加密了,即使文件夹权限正确,IIS仍会抛出相同的错误。


在这个确切的问题上花费了太多时间。只是来共鸣一下。我最终在搜索IIS和访问EFS时到达了这里,但是您的答案提示了我的问题的根本原因-来自Mac的扩展zip文件。 我的特定情况是ASP.NET Core在IIS中进程内托管无法启动-没有事件日志消息,没有标准输出日志等。通过localhost访问会显示一个错误消息,指出web.config无效,但没有显示源。显然文件是可访问的,但内容无法读取。 - Aaron

0
请在Windows 2012 R2中启用以下项目。

enter image description here


0

0

如果您正在使用应用程序池身份验证(而不是IUSR),那么这个Jean Sun的检查清单是我能找到的最好的解决IIS 401错误的方法:


打开IIS管理器,导航到您的网站或应用程序文件夹,该文件夹是站点部署的位置。

  1. 打开高级设置(在右侧操作窗格上)。
  2. 记下应用程序池名称,然后关闭此窗口。
  3. 双击身份验证图标以打开身份验证设置。
  4. 禁用Windows身份验证。
  5. 右键单击匿名身份验证,然后单击“编辑”。
  6. 选择应用程序池标识单选按钮,然后单击“确定”。
  7. 从IIS管理器树中选择应用程序池节点,并选择步骤3中记下的应用程序池名称。
  8. 右键单击并选择“高级设置”。
  9. 展开进程模型设置,从“内置帐户”下拉列表中选择ApplicationPoolIdentity,然后单击“确定”。
  10. 再次单击“确定”以保存和关闭应用程序池高级设置页面。
  11. 打开管理员命令行(右键单击CMD图标,然后选择“以管理员身份运行”。它可能在开始菜单下的附件中)。
  12. 运行以下命令:

    icacls <path_to_site> /grant "IIS APPPOOL\<app_pool_name>"(CI)(OI)(M)
    

    例如:

    icacls C:\inetpub\wwwroot\mysite\ /grant "IIS APPPOOL\DEFAULTAPPPOOL":(CI)(OI)(M)
    

特别是步骤5和6经常被忽视,在网上很少提到。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接