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 WebClientplace, 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' HttpClientimplé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 ' HttpClientest qu'il a une API asynchrone qui fonctionne bien avec Tasks, alors que l WebClient' API asyc doit être gérée avec des événements.
DownloadStringTaskAsyncdans .Net 4.5, qui peut également être utilisé avec async / await
HttpClientn'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).