50

I am trying to make a request to a web page using WebRequest class in .net. The url that I am trying to read requires Windows Authentication due to which I get an unauthorised exception. How can I pass a windows credentials to this request so that it can authenticate.

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create( "http://myapp/home.aspx" );

request.Method = "GET";
request.UseDefaultCredentials = false;
request.PreAuthenticate = true;
request.Credentials = new NetworkCredential( "username", "password", "domain" );

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); // Raises Unauthorized Exception

this.Response.Write( response.StatusCode );

The above code returns the following error.

System.Net.WebException: The remote server returned an error: (401) Unauthorized.

I noticed one thing while checking the exception details is that the url that I am trying to access is redirecting to a different url which is prompting me to provide the NT login details. I believe that the credentials should get forwarded to this url as well. But apparently it is not happening.

2

4 Answers 4

53

You should use Credentials property to pass the windows credentials to the web service.

If you wish to pass current windows user's credentials to the service then

request.Credentials = CredentialCache.DefaultCredentials;

should do the trick. Otherwise use NetworkCredential as follows:

request.Credentials = new NetworkCredential(user, pwd, domain);
Sign up to request clarification or add additional context in comments.

7 Comments

As you can see in the code which I have posted, I am using the NetworkCredential class to pass my windows login. But even that is not working.
Did you put the code later - I don't recall seeing it. Regardless, 401 error means credentials can be wrong or it can also mean that credentials are right but that user does not have access to that URL. I will suggest that you check your service url from browser. If it works from there then it should work with WebRequest as well as.
I edited the post and included the code. Also, I am able to access the url in the browser with the credentials but not able to do the same using WebRequest.
Try with request.PreAuthenticate = false; Reasoning is that server is throwing 401 as a challenge response and WebRequest would not respond to the challenge unless this property is false.
Tough luck! Just last suggestion - use tool such as Fiddler (www.fiddler2.com) and compare request-response chain from browser (to service) with the same from WebRequest. As you have said that service works from browser, by comparing request-response, you should get the idea where the problem is.
|
14

For authenticating to WebService, use DefaultNetworkCredentials instead of DefaultCredentials:

request.Credentials = CredentialCache.DefaultNetworkCredentials;

2 Comments

This fixed a problem I've been trying to fix for a week. Thank you!
I'm wondering if it could help to fix my current issue : stackoverflow.com/questions/67335532/… ? I read contradictory things regarding differences between each of them. I'll try ASAP.
10

I am trying to access a link A passing the windows credentials. Link A then redirects me to link B automatically but does not pass the windows credentials which I had supplied. Hence the error. I did request.AutoRedirect = false, and looped through every time I get location in the header i.e. I do my redirects manually each time passing the windows credentials.

This worked for me :)

Comments

7

Using VS2015, request.UseDefaultCredentials = true; works for me!

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.