我正在使用多個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>
仍然沒有運氣。
這可能會有所幫助,請嘗試添加配置條目: http://stackoverflow.com/questions/299940/how-should-i-set-the-default-proxy-to-use-default-credentials –
謝謝薩欽。我試着把它添加到網絡上。配置正在向API發出請求的Web應用程序:' '不幸的是我仍然收到相同的錯誤。 –
GuessAgainMatt