通常在设置 IIS 7 时,我习惯允许用户IIS APPPOOL\{应用程序池名称}在我的 Web 应用程序的根文件夹中。我还向 IUSR(或 IIS_IUSRS 用户组)授予权限。(请注意,在 Windows Server 2008 中,我发现 IUSR 默认不在该组中,因此我添加了它)。
在 Windows Server 2008 中,我找不到用户IIS APPPOOL\{应用程序池名称}在下面安全在 Windows 文件夹下特性。我在 ASP.NET 中使用 Windows 身份验证。在收到身份验证提示后,我在 Internet Explorer 8 的页面上收到 401.1。Mozilla Firefox 也向我提供了 Windows 身份验证提示,并让我顺利进入网站。Google Chrome 也是如此。
我该如何解决这个问题?
HTTP 错误 401.1 - 未经授权您无权使用您提供的凭据查看此目录或页面。
具体页面信息:
Module: WindowsAuthenticationModule
Notification: AuthenticateRequest
Handler: PageHandlerFactory-ISAPI-4.0_32bit
Error Code: 0x8009030e
Requested URL: http://.....aspx
Physical Path: C:\.........aspx
Logon Method: Not yet determined
Logon User: Not yet determined
答案1
这很可能是因为 IE 将使用您的经过身份验证的凭据而不是匿名用户帐户。如果您的经过身份验证的用户没有访问权限,则它将失败。一种解决方案是将经过身份验证的用户添加到站点的根文件夹。使用 IE,您在网络中使用的凭据将传递到站点,但使用其他浏览器时,它将要求一组新的凭据。
您在第三条评论中的链接听起来是个不错的线索。您是否尝试过关闭协商并查看会发生什么?更改第四个链接中的受信任区域和内联网区域也是一个好主意。
顺便说一句,在 Windows Server 2008 中,IIS_IUSRS 实际上是在运行中处理的,因此添加 IUSRS 不会造成任何损害,但也不是必需的。
答案2
我在 Server 2012 中遇到了同样的问题 - 无论出于什么原因,它都没有创建虚拟帐户(或者它们无法使用)。 - 我相信这与服务未运行有关AppHostSvc
。NetMan
- 最终,我采取了一种散弹枪式方法来修复它(不推荐,尝试在生产环境中尽可能少地做,但这个 PowerShell 可能会让你摆脱开发环境中的困境):
#Requires -Version 4
#Requires -RunAsAdministrator
#######################################
$DebugPreference = "SilentlyContinue";
$VerbosePreference = "SilentlyContinue";
$WarningPreference = "Continue";
$ErrorActionPreference = "Stop";
Set-PSDebug -Strict;
Set-StrictMode -Version 3;
#######################################
Get-WindowsOptionalFeature -Online `
| where { $_.FeatureName -ilike "*IIS*" -and $_.State -eq "Disabled" } `
| % { Enable-WindowsOptionalFeature -Online -FeatureName $_.FeatureName -All };
iisreset
Get-Service | ? { $_.ServiceName -eq "W3SVC" } | Start-Service;
Get-Service | ? { $_.ServiceName -eq "W3SVC" } | Set-Service -StartupType Automatic;
Get-Service | ? { $_.ServiceName -eq "WMSvc" } | Start-Service;
Get-Service | ? { $_.ServiceName -eq "WMSVC" } | Set-Service -StartupType Automatic;
Get-Service | ? { $_.ServiceName -eq "AppHostSvc" } | Start-Service;
Get-Service | ? { $_.ServiceName -eq "AppHostSvc" } | Set-Service -StartupType Automatic;
Get-Service | ? { $_.ServiceName -eq "Netman" } | Start-Service;
Get-Service | ? { $_.ServiceName -eq "Netman" } | Set-Service -StartupType Automatic;
iisreset
答案3
这个简短的描述使我理解并澄清了这个问题。
应用程序池标识帐户
IIS 6.0 和 IIS 7 中的工作进程默认以网络服务身份运行。网络服务是内置的 Windows 身份。它不需要密码,并且只有用户权限;也就是说,它的权限相对较低。以低权限帐户运行是一种很好的安全做法,因为这样恶意用户就无法利用软件错误来接管整个系统。
然而,随着越来越多的 Windows 系统服务开始以网络服务身份运行,问题也随之出现。这是因为以网络服务身份运行的服务可能会干扰以相同身份运行的其他服务。由于 IIS 工作进程默认运行第三方代码(经典 ASP、ASP.NET、PHP 代码),因此是时候将 IIS 工作进程与其他 Windows 系统服务隔离,并以唯一身份运行 IIS 工作进程了。Windows 操作系统提供了一项名为“虚拟帐户”的功能,允许 IIS 为其每个应用程序池创建唯一身份。单击此处了解有关虚拟账户。
配置 IIS 应用程序池标识
如果您在 Windows Server 2008 R2 上运行 IIS 7.5 或更高版本的 IIS,则无需执行任何操作即可使用新标识。对于您创建的每个应用程序池,新应用程序池的 Identity 属性默认设置为 ApplicationPoolIdentity。IIS 管理进程 (WAS) 将创建一个具有新应用程序池名称的虚拟帐户,并默认在此帐户下运行应用程序池的工作进程。
要在 Windows Server 2008 上运行 IIS 7.0 时使用此虚拟帐户,您必须将创建的应用程序池的 Identity 属性更改为 ApplicationPoolIdentity。方法如下:
- 打开 IIS 管理控制台 (INETMGR.MSC)。
- 打开计算机节点下方的应用程序池节点。选择要更改为在自动生成的应用程序池标识下运行的应用程序池。
- 右键单击应用程序池并选择高级设置...
- 选择身份列表项并单击省略号(带有三个点的按钮)。
- 出现以下对话框:
- 选择内置帐户按钮,然后从组合框中选择身份类型 ApplicationPoolIdentity。
要使用命令行执行相同的步骤,您可以按以下方式调用“appcmd”命令行工具:
%windir%\system32\inetsrv\appcmd.exe set AppPool <your AppPool> -processModel.identityType:ApplicationPoolIdentity
完整文档可在此处阅读:应用程序池标识