2016-08-23 31 views
4

我正在使用多個Intranet API來嘗試構建一些應用程序,這些應用程序具有某些由所有應用程序共享的服務。很多這些服務可以使用JavaScript請求直接從GUI調用,但是其他服務器應用程序需要調用其中一些服務。.NET WebApi HttpClient沒有將Windows身份驗證憑據發送到同一個域

所有前端和API都使用Windows身份驗證。現在我已經設置爲授權任何Windows身份驗證的用戶。匿名身份驗證被禁用。

我使用HttpClient從Web代碼內部連接到所需的服務。這裏有一個例子:

HttpClient client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true }); 
client.BaseAddress = new Uri(ConfigurationManager.AppSettings["OtherServiceUrl"]); 

client.DefaultRequestHeaders.Accept.Add(
    new MediaTypeWithQualityHeaderValue("application/json")); 

SomeResponseObject responseObject; 
HttpResponseMessage response = client.GetAsync("SomeController").Result; 
if (response.IsSuccessStatusCode) 
{ 
    responseObject = response.Content.ReadAsAsync<SomeResponseObject>().Result; 
} 
else 
{ 
    throw new ApplicationException("API request not successful"); 
} 

好消息是,當我在本地運行服務時,這工作得很好。壞消息是,當我部署到IIS時,對Web服務的調用失敗並帶有未經授權的響應。

經過大量的擺弄之後,我意識到唯一一次我得到未經授權的響應是當目標API的域與調用應用程序的域相同時。它在我的本地盒子上工作,因爲IIS Express爲每個應用程序分配一個新端口。匹配域的情況發生在IIS中,因爲我在IIS中的同一站點下創建了調用應用程序和API作爲應用程序,因此這兩個應用程序看起來像同一個域中的目錄。這幾乎就像HttpClient不會打擾從調用Web應用程序發送身份驗證,如果它注意到域匹配。

我在同一臺服務器上創建了一個新的站點,但綁定到了不同的端口,並將API放在那裏,然後再次嘗試。果然,這解決了這個問題,API的請求通過很好。

我可以放入一堆子域來處理所有這些不同的服務,或者只是依靠使用不同的端口爲了使這些服務的域獨一無二,但對我來說這種限制似乎很奇怪地點。有沒有人知道我是否可以在處理程序或客戶端上設置一個屬性,或者我可以做些什麼來允許在同一個IIS站點上運行的應用程序在使用Windows身份驗證時通過HttpClient與對方進行對話?

謝謝!

每薩欽的建議下,我也嘗試添加這使得通過HttpClient的API請求的應用程序的webconfig:

<system.net> 
    <defaultProxy useDefaultCredentials="true" /> 
</system.net> 

仍然沒有運氣。

+0

這可能會有所幫助,請嘗試添加配置條目: http://stackoverflow.com/questions/299940/how-should-i-set-the-default-proxy-to-use-default-credentials –

+0

謝謝薩欽。我試着把它添加到網絡上。配置正在向API發出請求的Web應用程序:' '不幸的是我仍然收到相同的錯誤。 – GuessAgainMatt

回答

3

看看這個:https://support.microsoft.com/en-us/kb/926642

對我來說,這是在Windows Server 2012上的一個相同的場景,但在KB的解決方案仍然適用。環回檢查將阻止證書通過httpClient發送,當它們在同一主機上時,會導致401。對我來說,唯一的解決方法是方法2 - 在註冊表中設置DisableLoopbackCheck。我知道這是一個安全「功能」,但它在傳統Windows環境中使用現代面向服務的體系結構當然是一個障礙。

+0

謝謝Brian!第一種方法適用於我。如果鏈接失效,解決方案涉及添加註冊表項以允許回送請求。首選方法是將一個名爲BackConnectionHostNames的多字符串值添加到HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa \ MSV1_0子項中,每個DNS項都要在其自己的行上引用。如果不起作用,可以完全禁用回送檢查,方法是將名爲DisableLoopbackCheck的DWORD和值1添加到HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa子項。 – GuessAgainMatt