我有一个 ASP 文件试图向在同一虚拟目录下的同一台服务器上运行的 ASP.NET web 服务发出 web 服务请求。在 IIS 中,虚拟目录设置为禁用匿名访问,并打开“集成 Windows 身份验证”。
所以问题是,当用户的机器请求运行 ASP 页面甚至手动运行 WebService.asmx .NET 文件时,它可以工作,因为用户的凭据被传递,但是当 ASP 文件尝试调用 web 服务时,我们得到一个401.2 - 未经授权:访问因服务器配置而被拒绝。
例如:
- 来自用户计算机上的浏览器的“DIRECTORY\user1”请求运行良好的 Service.asmx。
- 来自用户计算机上的浏览器的“DIRECTORY\user1”请求 File1.asp,它工作正常。
- _________ 从服务器上的 File1.asp 中请求返回 401.2 的 Service.asmx
所以我假设我需要在 WebService.asmx 上设置 NTFS 权限以允许 ASP 帐户读取和执行权限,但我不知道它在哪个帐户下运行,并且在阅读了一些响应后进一步思考,似乎我们没有达到 NTFS 级别,IIS 完全拒绝该请求,因为匿名访问已关闭。
这是否表明我们需要让 ASP 进程在域帐户下运行?
经典 ASP 运行模拟在 HTTP 会话中通过服务器身份验证的用户。您需要授予正在验证的用户运行经典 ASP 应用程序权限或允许匿名访问。
如果您已经尝试过“经过身份验证的用户”并且它不起作用,那么我会说您没有文件权限问题。
当您说“...ASP 文件尝试调用 Web 服务...”时,您是什么意思?您是说 ASP 脚本正在向服务器发出 HTTP 请求吗?如果是这样,用户的凭据将不会在该请求中传递,因为“集成 Windows 身份验证”不会为服务器提供明文密码,以便在向其他服务器(或自身)进行身份验证时使用。
编辑:
然后,根据您的评论,如上所述,服务器将没有用于对用户进行身份验证的凭据,因为集成 Windows 身份验证为服务器提供了没有明文密码以传递给其他服务器(或它本身,在这种情况下是另一台服务器) )。
您可以尝试三件事:
如果您可以让 WebService.asmx 允许匿名访问,您的服务器到自身的 HTTP 调用应该可以工作(您需要通过允许 IUSR_xxx 读取文件并修改“匿名访问和身份验证控制”设置来明确允许匿名访问通过 IIS 管理控制台管理单元对文件本身进行“匿名访问”,因为该文件将从它所在的目录继承启用的“集成 Windows 身份验证”和禁用的“匿名访问”设置)。
如果您用于获取 HTTP 请求的控件支持透明地将登录用户的凭据提供给远程服务器,您可以在经典 ASP 脚本上启用“基本身份验证”(它确实为服务器提供了一个明文密码以通过到其他服务器),以便您的 HTTP 请求控件可以在请求 WebService.asmx 期间传递该明文密码。此时,您将需要 SSL 访问经典的 ASP 脚本,以使明文密码远离网络。
最后,您可以在经典 ASP 脚本中硬编码一些基本身份验证凭据,并在 WebService.asmx 文件上启用基本身份验证。这意味着 WebService.asmx 将始终看到来自同一用户的访问。
这些都不是很好的解决方案。当您尝试以经过身份验证以运行经典 ASP 脚本的用户身份验证后端层(数据库等)时,您遇到了我们在“经典 ASP”中看到的“经典”问题。
如果集成身份验证已打开并且用户正在使用将执行 windows 集成身份验证的浏览器并且用户以转换为 Web 服务器的帐户登录(例如,客户端计算机与 Web 服务器位于同一域中) 您的脚本将作为该用户的帐户运行。
如果上述任何一项为假(因此服务器无法与客户端浏览器同意用户帐户),那么
IUSR_<machine>
默认情况下使用您设置为匿名用户的任何内容,或者如果禁用匿名浏览,用户将得到 401.* 错误。这假设其他认证意见是关闭的。如果您同时启用了 Windows 集成和基本身份验证方案,我不确定什么优先。
您可以通过放入查询 reqeust.servervariables 集合并输出相关值的脚本来查看 Web 服务器当前用于请求特定区域的用户 - 用户名在其中。
看起来您正在尝试进行“双跳”身份验证。通常这发生在后端 SQL 服务的上下文中,但我认为它可能适用于在同一台服务器上运行的单独服务(虽然我不是 100% 确定)。在 MSKB 中搜索该术语“双跳”,您将获得一些解释如何设置委托以使其工作的文档。这是一个开始,http://support.microsoft.com/kb/326985
您需要将 IIS 服务器设置为“允许委派”。当用户通过 Windows 集成身份验证进行身份验证时,他们应该获得 Kerberos 票证(如果您获得 NTLM 身份验证,这将不起作用)。
为了进行委派,您需要向服务器添加一个 SPN。确保用户使用服务器在 AD 中具有 SPN 的实际 FQDN 访问网页。服务主体名称 (SPN) 是用户 Kerberos 代理将用来创建正确的 Kerberos 票证的名称,这将允许 IIS 服务器在将请求移交给下一个服务时模拟用户。
网络服务使用登录用户的凭据是否重要?如果您使用 MSXML2.ServerXMLHTTPRequest 之类的东西来调用 Web 服务,您是否可以简单地在 .Open 方法中提供凭据来为 Web 服务提供一组固定的凭据?