Saya memiliki aplikasi web (dihosting di IIS) yang berbicara ke layanan Windows. Layanan Windows menggunakan ASP.Net MVC Web API (self-host), dan dapat dikomunikasikan dengan lebih dari http menggunakan JSON. Aplikasi web dikonfigurasi untuk melakukan peniruan, gagasannya adalah bahwa pengguna yang membuat permintaan ke aplikasi web harus menjadi pengguna yang digunakan aplikasi web untuk membuat permintaan ke layanan. Strukturnya terlihat seperti ini:
(Pengguna yang disorot dengan warna merah adalah pengguna yang dirujuk dalam contoh di bawah ini.)
Aplikasi web membuat permintaan ke layanan Windows menggunakan HttpClient
:
var httpClient = new HttpClient(new HttpClientHandler()
{
UseDefaultCredentials = true
});
httpClient.GetStringAsync("http://localhost/some/endpoint/");
Ini membuat permintaan ke layanan Windows, tetapi tidak melewati kredensial dengan benar (layanan melaporkan pengguna sebagai IIS APPPOOL\ASP.NET 4.0
). Ini bukan yang saya inginkan terjadi .
Jika saya mengubah kode di atas untuk menggunakan WebClient
, kredensial pengguna diberikan dengan benar:
WebClient c = new WebClient
{
UseDefaultCredentials = true
};
c.DownloadStringAsync(new Uri("http://localhost/some/endpoint/"));
Dengan kode di atas, layanan melaporkan pengguna sebagai pengguna yang membuat permintaan ke aplikasi web.
Apa yang saya lakukan salah dengan HttpClient
implementasi yang menyebabkannya tidak lulus kredensial dengan benar (atau apakah itu bug dengan HttpClient
)?
Alasan saya ingin menggunakan HttpClient
adalah karena ia memiliki API async yang bekerja dengan baik dengan Task
s, sedangkan WebClient
API asyc perlu ditangani dengan acara.
DownloadStringTaskAsync
.Net 4.5, yang juga dapat digunakan dengan async / menunggu
HttpClient
tidak punya SetCredentials()
metode. Bisakah Anda mengarahkan saya ke maksud Anda?
new HttpClient(new HttpClientHandler() { AllowAutoRedirect = true, UseDefaultCredentials = true }
di server web yang diakses oleh pengguna terotentikasi Windows, dan situs web melakukan otentikasi untuk sumber daya jarak jauh lain setelah itu (tidak akan mengotentikasi tanpa flag yang ditetapkan).