簡體   English   中英

.NET WebApi HttpClient未將Windows身份驗證憑據發送到同一域

[英].NET WebApi HttpClient not sending Windows Authentication credentials to same domain

我正在使用多個Intranet API來嘗試構建一些具有所有應用程序共享的服務的應用程序。 可以使用Javascript請求直接從GUI調用許多這些服務,但是其他服務器應用程序需要調用一些服務。

所有前端和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相互通信?

謝謝!

根據Sachin的建議,我也嘗試將此添加到通過HttpClient發出API請求的應用程序的webconfig:

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

仍然沒有運氣。

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

在我的情況下,它是Windows Server 2012上的相同方案,但KB中的解決方案仍然適用。 環回檢查將阻止憑據在它們位於同一主機上時通過httpClient發送,這導致401.對我來說,唯一的解決方案是方法2 - 在注冊表中設置DisableLoopbackCheck。 我知道這是一個安全“功能”,但它肯定是在經典Windows環境中使用現代面向服務的體系結構的障礙。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM