我有一个使用NTLM凭据调用的ASPX页面(在服务器A上)。该页面的一部分工作是调用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();
}
答案 0 :(得分:1)
您当然可以获取呼叫者的登录名,但不能获取密码。 NTLM使用质询/响应机制,因此密码永远不会传输。您的服务器必须能够访问密码等效(散列)以形成质询并检查响应,但即使您可以获得它,在尝试形成凭据时,密码等效也没有用处将被服务器B接受。
如果您可以设置模拟,如另一个答案中所述,即使这样也不一定能满足您的需求。默认情况下,不允许模拟服务器进程将其标识传输到另一台服务器。第二跳称为委托,需要在相关服务器(和/或Active Directory)中明确配置。
除了委托之外,我认为您唯一的选择是维护服务器A可以访问并呈现给服务器B的凭证数据库。以安全的方式构建这是一个微妙且耗时的过程。另一方面,默认情况下禁用委派是有原因的。当我登录服务器时,是否希望允许它使用我的身份访问其他服务器?委派对您来说是最简单的选择,但您需要确保服务器A不会因为您的用户身份而做出不负责任的行为。
答案 1 :(得分:0)
Page.User将为您提供运行该页面的用户的安全主体。
从那里你应该能够弄明白。
答案 2 :(得分:0)
您的场景中是否可以冒充来电者身份?这样你甚至不需要传递凭证,例如:
<authentication mode="Windows" />
<identity impersonate="true" />
在服务器A的web.config中。但这当然取决于您的情况,因为您可能不希望服务器A.但如果可以,这可以在没有自定义代码的情况下解决您的问题。
下面是设置模拟的链接:http://msdn.microsoft.com/en-us/library/ms998351.aspx#paght000023_impersonatingorigcaller