从" APSX"页面上的"响应"中获取NTLM凭据
我有一个ASPX页(在服务器A上),该页是使用NTLM凭据调用的。该页面的一部分工作是调用HTML页面(在服务器B上)并将其代理回客户端。 (防火墙允许访问A,但不允许访问B。通常,将允许用户访问两台服务器。)。服务器B也不对匿名访问开放,因此我需要为其提供凭据。
如果我对某些凭据进行硬编码(按照随附的代码),则可以正常工作,但理想情况下,我将回显.aspx页收到的凭据。有什么方法可以获取那些NetworkCredentials,以便我将其传递下去?
protected void Page_Load(object sender, EventArgs e) { Response.Clear(); WebClient proxyFile = new WebClient(); CredentialCache cc = new CredentialCache(); cc.Add(new Uri("http://serverB/"), "NTLM", new NetworkCredential("userName", "password", "domain")); proxyFile.Credentials = cc; Stream proxyStream = proxyFile.OpenRead("http://serverB/Content/webPage.html"); int i; do { i = proxyStream.ReadByte(); if (i != -1) { Response.OutputStream.WriteByte((byte)i); } } while (i != -1); Response.End(); }
解决方案
Page.User将为我们提供运行页面的用户的安全主体。
从那里我们应该能够弄清楚。
我们能否在方案中模拟呼叫者的身份?这样,我们甚至都不需要传递凭据,例如:
<authentication mode="Windows" /> <identity impersonate="true" />
在服务器A的web.config中。但这当然取决于情况,因为我们可能不需要服务器A。但是,如果可以的话,这可以在没有自定义代码的情况下解决问题。
以下是用于设置模拟的链接:http://msdn.microsoft.com/zh-cn/library/ms998351.aspx#paght000023_impersonatingorigcaller
我们当然可以获取呼叫者的登录名,但不能获取密码。 NTLM使用质询/响应机制,因此永远不会传输密码。服务器必须有权访问等效密码(哈希)以构成挑战并检查响应,但是即使我们掌握了该密码,等效密码也无济于事。将被服务器B接受。
如果我们可以按照另一个答案中的描述设置模拟功能,即使这并不一定能获得所需的信息。默认情况下,不允许模拟服务器进程将其标识传输到另一台服务器。第二跳称为委派,需要在涉及的服务器(和/或者Active Directory)中进行显式配置。
除了委派之外,我认为我们唯一的选择是维护服务器A可以访问并提供给服务器B的凭据数据库。以安全的方式进行构建是一个微妙且耗时的过程。另一方面,默认情况下禁用委派是有原因的。当我登录到服务器时,是否希望它被允许使用我的身份访问其他服务器?委派是我们最简单的选择,但是我们需要确保不会损害服务器A来对用户的身份做不负责任的事情。