J'ai une application Web (hébergée dans IIS) qui communique avec un service Windows. Le service Windows utilise l'API Web ASP.Net MVC (auto-hébergée) et peut donc être communiqué via http à l'aide de JSON. L'application Web est configurée pour effectuer une usurpation d'identité, l'idée étant que l'utilisateur qui fait la demande à l'application Web doit être l'utilisateur que l'application Web utilise pour faire la demande au service. La structure ressemble à ceci:
(L'utilisateur surligné en rouge est l'utilisateur auquel il est fait référence dans les exemples ci-dessous.)
L'application Web envoie des demandes au service Windows à l'aide d'un HttpClient
:
var httpClient = new HttpClient(new HttpClientHandler()
{
UseDefaultCredentials = true
});
httpClient.GetStringAsync("http://localhost/some/endpoint/");
Cela fait la demande au service Windows, mais ne transmet pas correctement les informations d'identification (le service signale l'utilisateur comme IIS APPPOOL\ASP.NET 4.0
). Ce n'est pas ce que je souhaite .
Si je change le code ci-dessus pour utiliser à la WebClient
place, les informations d'identification de l'utilisateur sont transmises correctement:
WebClient c = new WebClient
{
UseDefaultCredentials = true
};
c.DownloadStringAsync(new Uri("http://localhost/some/endpoint/"));
Avec le code ci-dessus, le service signale l'utilisateur comme l'utilisateur qui a fait la demande à l'application Web.
Qu'est-ce que je fais mal avec l' HttpClient
implémentation qui fait qu'elle ne transmet pas correctement les informations d'identification (ou est-ce un bogue avec le HttpClient
)?
La raison pour laquelle je veux utiliser l ' HttpClient
est qu'il a une API asynchrone qui fonctionne bien avec Task
s, alors que l WebClient
' API asyc doit être gérée avec des événements.
DownloadStringTaskAsync
dans .Net 4.5, qui peut également être utilisé avec async / await
HttpClient
n'a pas de SetCredentials()
méthode. Pouvez-vous m'indiquer ce que vous voulez dire?
new HttpClient(new HttpClientHandler() { AllowAutoRedirect = true, UseDefaultCredentials = true }
sur un serveur Web accédé par un utilisateur authentifié par Windows, et le site Web s'est authentifié pour une autre ressource distante après cela (ne s'authentifierait pas sans le jeu d'indicateurs).