I\'m trying to communicate with a self-hosted WebAPI client using HttpClient
. The client is created with the following code:
HttpClientHandler clien
What you are experiencing is normal, this is how the NTLM authentication scheme works.
1: C --> S GET ...
2: C <-- S 401 Unauthorized
WWW-Authenticate: NTLM
3: C --> S GET ...
Authorization: NTLM <base64-encoded type-1-message>
4: C <-- S 401 Unauthorized
WWW-Authenticate: NTLM <base64-encoded type-2-message>
5: C --> S GET ...
Authorization: NTLM <base64-encoded type-3-message>
6: C <-- S 200 Ok
GET
request to the server.401 Unathorized
response and notifies the client in the WWW-Authenticate
header that it supports NTLM
authentication. So this is where you get your first 401
response code.Authorization
header. Note that based solely on these information the client cannot be authenticated yet.401
response code.200
response code and the requested resource to the client.Faced a similar issue, and after going through a lot of answers, where none of those worked. The following worked, and it doesn't come up with two 401's:
var credential = new NetworkCredential("username", "password", "domainname");
var myCache = new CredentialCache();
// Add the target Uri to the CredentialCache with credential object
myCache.Add(new Uri("http://targeturi/"), "NTLM", credential);
// Create an HttpClientHandler to add some settings
var handler = new HttpClientHandler();
handler.AllowAutoRedirect = true;
handler.Credentials = myCache;
// Create an HttpClient with the handler object
httpClient = new HttpClient(handler);
// Wait to get the reponse, and you can use the reponse in your code
HttpResponseMessage response = await httpClient.GetAsync(resourceUri);
Source
the default behavior where it only sends credentials after receiving an HTTP 401 Not Authorized response.
Manually adding the credentials header seems to be the best solution available.
More details in this post