1

我有一个使用 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(); 
} 
4

3 回答 3

1

您当然可以获取调用者的登录名,但不能获取密码。NTLM 使用质询/响应机制,因此永远不会传输密码。您的服务器必须有权访问密码等效项(哈希)才能形成质询并检查响应,但即使您可以掌握它,该密码等效项对您尝试形成的凭据也没有用处将被服务器 B 接受。

如果您可以设置模拟,如另一个答案中所述,即使这样也不一定能得到您想要的。默认情况下,不允许模拟服务器进程将其身份传输到另一台服务器。第二个跃点称为委托,需要在所涉及的服务器上(和/或在 Active Directory 中)显式配置。

Apart from delegation I think your only option is to maintain a database of credentials that server A can access and present to server B. Building that in a secure manner is a subtle and time-consuming process. On the other hand, there is a reason why delegation is disabled by default. When I log into a server, do I want it to be allowed to use my identity for accessing other servers? Delegation is the simplest option for you, but you'll need to be sure that server A can't be compromised to do irresponsible things with your users' identities.

于 2008-10-01T19:11:50.730 回答
0

Page.User 将为您获取运行该页面的用户的安全主体。

从那里你应该能够弄清楚。

于 2008-10-01T18:26:06.410 回答
0

你能在你的场景中冒充呼叫者的身份吗?这样你甚至不需要传递凭据,例如:

<authentication mode="Windows" />
<identity impersonate="true" />

在服务器 A 的 web.config 中。但这当然取决于您的情况,因为您可能不希望服务器 A 那样。但是如果可以的话,这可以在没有自定义代码的情况下解决您的问题。

下面是设置模拟的链接:http: //msdn.microsoft.com/en-us/library/ms998351.aspx#paght000023_impersonatingorigcaller

于 2008-10-01T18:32:59.030 回答