Mam aplikację internetową (hostowaną w IIS), która komunikuje się z usługą systemu Windows. Usługa systemu Windows korzysta z interfejsu API sieci Web ASP.Net MVC (samodzielnie hostowana), więc można ją komunikować za pośrednictwem protokołu HTTP przy użyciu formatu JSON. Aplikacja internetowa jest skonfigurowana do podszywania się, a idea polega na tym, że użytkownik, który wysyła żądanie do aplikacji internetowej, powinien być użytkownikiem, którego aplikacja internetowa używa do wysłania żądania do usługi. Struktura wygląda następująco:
(Użytkownik wyróżniony na czerwono to użytkownik, o którym mowa w poniższych przykładach).
Aplikacja internetowa wysyła żądania do usługi Windows za pomocą HttpClient
:
var httpClient = new HttpClient(new HttpClientHandler()
{
UseDefaultCredentials = true
});
httpClient.GetStringAsync("http://localhost/some/endpoint/");
Powoduje to wysłanie żądania do usługi systemu Windows, ale nie przekazuje poprawnie poświadczeń (usługa zgłasza użytkownika jako IIS APPPOOL\ASP.NET 4.0
). Nie tego chcę .
Jeśli zmienię powyższy kod, aby WebClient
zamiast tego używał a, poświadczenia użytkownika są przekazywane poprawnie:
WebClient c = new WebClient
{
UseDefaultCredentials = true
};
c.DownloadStringAsync(new Uri("http://localhost/some/endpoint/"));
Za pomocą powyższego kodu usługa zgłasza użytkownika jako użytkownika, który zgłosił żądanie do aplikacji internetowej.
Co robię źle z HttpClient
implementacją, która powoduje, że nie przekazuje ona poprawnie poświadczeń (lub czy jest to błąd z HttpClient
)?
Powodem, dla którego chcę użyć HttpClient
jest to, że ma async API, które działa dobrze z Task
s, podczas gdy WebClient
asyc API musi być obsługiwane ze zdarzeniami.
DownloadStringTaskAsync
w .Net 4.5, który może być również używany z async / await
HttpClient
nie ma SetCredentials()
metody. Czy możesz wskazać mi, co masz na myśli?
new HttpClient(new HttpClientHandler() { AllowAutoRedirect = true, UseDefaultCredentials = true }
na serwerze sieciowym, do którego dostęp miał użytkownik uwierzytelniony w systemie Windows, a następnie witryna sieci Web uwierzytelniła się dla innego zdalnego zasobu (nie uwierzytelniłaby się bez ustawionej flagi).