当集成的Windows身份validation打开时,ASP(classic)运行在哪个帐户下?

我有一个ASP文件,试图对同一个虚拟目录下的同一台服务器上运行的ASP.NET web服务发出web服务请求。 在IIS中,虚拟目录设置为禁用匿名访问,“集成Windows身份validation”处于打开状态。

所以问题是,当用户的机器请求运行ASP页面,甚至手动运行WebService.asmx .NET文件,它的工作原理是因为用户的凭据传递,但是当ASP文件试图调用Web服务时,我们得到401.2 – 未经授权:由于服务器configuration,访问被拒绝。

例如:

  • 用户计算机上的浏览器中的“DIRECTORY \ user1”请求Service.asmx正常工作。
  • 用户机器上的浏览器中的“DIRECTORY \ user1”请求File1.asp正常工作。
  • _________从服务器上的File1.asp请求返回401.2的Service.asmx

所以我假设我需要在WebService.asmx上设置NTFS权限,以允许ASP帐户读取和执行权限,但我不知道它在哪个帐户下运行,并且在阅读了一些响应之后进一步思考,似乎我们没有达到NTFS级别,IIS完全拒绝请求,因为匿名访问被closures。

这是否表明我们需要让ASP进程在域帐户下运行?

经典的ASP运行模拟在HTTP会话中向服务器进行身份validation的用户。 您需要授予正在进行身份validation的用户运行传统的ASP应用程序权限或允许匿名访问。

如果你已经尝试过“身份validation的用户”,它不工作,那么我会说你没有文件权限问题。

当你说“… ASP文件试图调用web服务…”时,你是什么意思? 你是说ASP脚本正在向服务器发送HTTP请求吗? 如果是这样,那么用户的凭证就不会在该请求中传递,因为“集成Windows身份validation”在向其他服务器(或其自身)进行身份validation时不会为服务器提供纯文本密码。

编辑:

然后,根据您的评论,如上所述,服务器将没有证书来validation用户,因为集成的Windows身份validation不会将密码传递给其他服务器(或其本身,这是另一个服务器在这种情况下)。

你可以尝试三件事:

  • 如果您可以让WebService.asmx允许匿名访问,那么您的服务器之间的HTTP调用应该可以工作(您需要明确允许匿名访问,方法是允许IUSR_xxx读取文件修改“匿名访问和身份validation控制”设置对于文件本身的“匿名访问”,通过IISpipe理控制台pipe理单元,因为该文件将inheritance已启用的“集成Windows身份validation”并禁用其所在目录中的“匿名访问”设置。

  • 如果您用来发送HTTP请求的控件支持将login用户的凭据透明地提供给远程服务器,那么您可以在传统ASP脚本上启用“基本身份validation”(这会为服务器提供纯文本密码在其他服务器上),以便您的HTTP请求控制可以在请求WebService.asmx期间传递该明文密码。 您需要在访问传统的ASP脚本时要求使用SSL,以保持明文密码的连线。

  • 最后,您可以在传统ASP脚本中的某些基本身份validation凭证中进行硬编码,并在WebService.asmx文件上启用基本身份validation。 这意味着WebService.asmx将始终可以看到来自同一用户的访问。

这些都不是很好的解决scheme。 当您尝试通过身份validation以运行经典ASP脚本进行身份validation到后端层(数据库等)时,您遇到了“经典ASP”所看到的“经典”问题。

如果集成身份validation处于打开状态,并且用户正在使用将执行Windows集成身份validation的浏览器, 并且用户以账户的身份login,而该帐户将转换为Web服务器(例如,客户端计算机与Web服务器位于同一个域中)您的脚本将以该用户的帐户运行。

如果上述任何一项是错误的(所以服务器不能同意用户帐户与客户端浏览器),那么你使用匿名用户设置为默认值, IUSR_<machine>默认,或者匿名浏览禁用该用户将得到一个401. *错误。

这假定其他authentication意见是closures的。 如果您同时启用Windows集成和基本身份validationscheme,我不确定优先级。

您可以通过放入查询reqeust.servervariables集合的脚本来查看Web服务器当前正在使用的用户对特定区域的请求,并输出相关的值 – 用户名在那里。

看起来你正在尝试做一个“双跳”authentication。 通常这发生在后端SQL服务的上下文中,但它可能适用于运行在同一服务器上的单独服务,我认为(尽pipe我不是100%确定的)。 在MSKB中search“double hop”这个术语,你会得到一些文档来解释如何设置代理以使其工作。 下面是一个开始, http://support.microsoft.com/kb/326985

你需要的是为IIS服务器设置“允许的授权”。 当用户通过Windows集成身份validation进行身份validation时,他们应该得到一个Kerberos票证(如果您正在获得NTLM身份validation,这将不起作用)。

为了进行授权,您需要将SPN添加到服务器。 确保用户正在使用实际的FQDN访问网页,服务器在AD中具有SPN。 服务主体名称(Service Principal Name,SPN)是用户Kerberos代理将用来创build正确的Kerberos票据,这将允许IIS服务器在将请求转交给下一个服务时模拟用户。

Web服务使用login用户的凭据是重要的吗? 如果您正在使用类似MSXML2.ServerXMLHTTPRequest的方式调用Web服务,您是否可以简单地使用.Open方法提供credentails以向Web服务提供一组固定的凭据?