2008-10-01 53 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