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