ฉันมีเว็บแอปพลิเคชั่น (โฮสต์ใน IIS) ที่พูดคุยกับบริการของ Windows บริการ Windows กำลังใช้ ASP.Net MVC Web API (โฮสต์ด้วยตนเอง) และสามารถสื่อสารกับผ่าน http โดยใช้ JSON แอปพลิเคชันเว็บได้รับการกำหนดค่าให้ทำการแอบอ้างเป็นแนวคิดที่ว่าผู้ใช้ที่ทำการร้องขอไปยังเว็บแอปพลิเคชันควรเป็นผู้ใช้ที่เว็บแอปพลิเคชันใช้ในการร้องขอบริการ โครงสร้างมีลักษณะดังนี้:

(ผู้ใช้ที่เน้นด้วยสีแดงคือผู้ใช้ที่ถูกอ้างถึงในตัวอย่างด้านล่าง)
เว็บแอปพลิเคชันส่งคำขอไปยังบริการ Windows โดยใช้HttpClient:
var httpClient = new HttpClient(new HttpClientHandler()
{
UseDefaultCredentials = true
});
httpClient.GetStringAsync("http://localhost/some/endpoint/");
สิ่งนี้ทำให้การร้องขอไปยังบริการ Windows แต่ไม่ผ่านข้อมูลประจำตัวอย่างถูกต้อง (บริการรายงานผู้ใช้เป็นIIS APPPOOL\ASP.NET 4.0) นี้ไม่ได้เป็นสิ่งที่ฉันต้องการให้เกิดขึ้น
ถ้าฉันเปลี่ยนรหัสข้างต้นเพื่อใช้WebClientแทนข้อมูลประจำตัวของผู้ใช้จะถูกส่งผ่านอย่างถูกต้อง:
WebClient c = new WebClient
{
UseDefaultCredentials = true
};
c.DownloadStringAsync(new Uri("http://localhost/some/endpoint/"));
ด้วยรหัสด้านบนบริการรายงานผู้ใช้เป็นผู้ใช้ที่ร้องขอไปยังเว็บแอปพลิเคชัน
ฉันทำอะไรผิดกับการHttpClientใช้งานที่ทำให้ไม่ผ่านข้อมูลประจำตัวอย่างถูกต้อง (หรือเป็นจุดบกพร่องด้วยHttpClient)
เหตุผลที่ฉันต้องการใช้HttpClientคือมี async API ที่ทำงานได้ดีกับTasks ในขณะที่WebClientasyc API ของต้องจัดการกับเหตุการณ์
DownloadStringTaskAsyncใน. Net 4.5 ซึ่งสามารถใช้กับ async / await ได้
HttpClientไม่มีSetCredentials()วิธี คุณช่วยชี้ให้ฉันในสิ่งที่คุณหมายถึง?
new HttpClient(new HttpClientHandler() { AllowAutoRedirect = true, UseDefaultCredentials = true }บนเว็บเซิร์ฟเวอร์ที่เข้าถึงโดยผู้ใช้ที่ได้รับการรับรองความถูกต้องของ Windows และเว็บไซต์ทำการตรวจสอบสิทธิ์สำหรับทรัพยากรระยะไกลอื่นหลังจากนั้น (จะไม่รับรองความถูกต้องหากไม่มีชุดธง)