2008-10-01 49 views
1

我有一个使用NTLM凭据调用的ASPX页面(在服务器A上)。该页面的一部分工作是调用HTML页面(在服务器B上)并将其代理回客户端。 (防火墙允许访问A,但不允许B访问。用户通常可以访问两台服务器。)。服务器B也不开放给匿名访问,所以我需要提供凭据给它。从APSX页面的响应中获取NTLM凭据

如果我硬编码一些凭据(按照附加的代码),它可以工作,但理想情况下我会回显.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(); 
} 

回答

1

你肯定能获得呼叫者的登录名,而不是密码。 NTLM使用质询/响应机制,所以密码永远不会传输。您的服务器必须能够访问与密码等效的(哈希),以便形成挑战并检查响应,但即使您可以获得与密码等效的内容,在尝试形成证书时也无济于事将被服务器B接受。

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

除了授权,我认为你唯一的选择是维护一个服务器A可以访问并呈现给服务器B的凭证数据库。以安全的方式构建这个过程是一个微妙且耗时的过程。另一方面,为什么默认禁用委托是有原因的。当我登录到服务器时,是否希望允许其使用我的身份访问其他服务器?授权对你来说是最简单的选择,但你需要确保服务器A不会因为你的用户身份而做出不负责任的事情。

0

Page.User将让你的网页在其下运行的用户的安全主体。

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

0

你可以在你的场景中模拟呼叫者身份吗?这样你wouldnt甚至需要沿凭据传递,例如:

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

在服务器A的web.config中,但当然这取决于你的情况,你可能不希望这样的服务器A.但如果你这可以解决您的问题,而无需自定义代码。

下面有一个链接,设置模拟:http://msdn.microsoft.com/en-us/library/ms998351.aspx#paght000023_impersonatingorigcaller