ฉันมีเว็บแอปพลิเคชั่น (โฮสต์ใน 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 ที่ทำงานได้ดีกับTask
s ในขณะที่WebClient
asyc API ของต้องจัดการกับเหตุการณ์
DownloadStringTaskAsync
ใน. Net 4.5 ซึ่งสามารถใช้กับ async / await ได้
HttpClient
ไม่มีSetCredentials()
วิธี คุณช่วยชี้ให้ฉันในสิ่งที่คุณหมายถึง?
new HttpClient(new HttpClientHandler() { AllowAutoRedirect = true, UseDefaultCredentials = true }
บนเว็บเซิร์ฟเวอร์ที่เข้าถึงโดยผู้ใช้ที่ได้รับการรับรองความถูกต้องของ Windows และเว็บไซต์ทำการตรวจสอบสิทธิ์สำหรับทรัพยากรระยะไกลอื่นหลังจากนั้น (จะไม่รับรองความถูกต้องหากไม่มีชุดธง)