Ho un'applicazione Web (ospitata in IIS) che parla con un servizio Windows. Il servizio Windows utilizza l'API Web ASP.Net MVC (self-hosted) e pertanto può essere comunicato tramite http tramite JSON. L'applicazione Web è configurata per eseguire la rappresentazione, con l'idea che l'utente che effettua la richiesta all'applicazione Web dovrebbe essere l'utente che l'applicazione Web utilizza per effettuare la richiesta al servizio. La struttura si presenta così:
(L'utente evidenziato in rosso è l'utente a cui si fa riferimento negli esempi seguenti.)
L'applicazione Web invia richieste al servizio Windows utilizzando un HttpClient
:
var httpClient = new HttpClient(new HttpClientHandler()
{
UseDefaultCredentials = true
});
httpClient.GetStringAsync("http://localhost/some/endpoint/");
Questo invia la richiesta al servizio Windows, ma non trasferisce correttamente le credenziali (il servizio riporta l'utente come IIS APPPOOL\ASP.NET 4.0
). Non è quello che voglio succedere .
Se cambio invece il codice sopra per utilizzare un WebClient
, le credenziali dell'utente vengono passate correttamente:
WebClient c = new WebClient
{
UseDefaultCredentials = true
};
c.DownloadStringAsync(new Uri("http://localhost/some/endpoint/"));
Con il codice sopra riportato, il servizio segnala l'utente come l'utente che ha effettuato la richiesta all'applicazione Web.
Cosa sto facendo di sbagliato HttpClient
nell'implementazione che sta causando il mancato passaggio corretto delle credenziali (o è un bug con HttpClient
)?
Il motivo per cui voglio usare HttpClient
è che ha un'API asincrona che funziona bene con Task
s, mentre l' WebClient
API asyc deve essere gestita con eventi.
DownloadStringTaskAsync
in .Net 4.5, che può anche essere usato con async / await
HttpClient
non ha un SetCredentials()
metodo. Puoi indicarmi cosa intendi?
new HttpClient(new HttpClientHandler() { AllowAutoRedirect = true, UseDefaultCredentials = true }
su un server Web a cui accede un utente autenticato da Windows, e il sito Web si è autenticato per un'altra risorsa remota successivamente (non si autenticherà senza il flag impostato).