从ASPX页面上的Response获取NTLM凭据

时间:2008-10-01 17:39:23

标签: c# asp.net credentials

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

3 个答案:

答案 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