ARTICLE

The request failed with HTTP status 401: Access Denied.

Posted by Mahesh Chand Articles | Error Zone June 30, 2006
An unhandled exception occurred during the execution of the current Web request. Please review the stack trace for more information about the error and where it originated in the code.
Reader Level:

Note: This is KB article is taken from MSDN as it is for my own reference.

SYMPTOMS

When you try to call a Web service application and Anonymous access authentication is turned off, you may receive the following error message.
The request failed with HTTP status 401: Access Denied.

Description: An unhandled exception occurred during the execution of the current Web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Net.WebException: The request failed with HTTP status 401: Access Denied.
 

CAUSE

When Anonymous access authentication is turned off for the Web service application, all the caller applications must provide the credentials before making any request. By default, the Web service client proxy does not inherit the credentials of the security context where the Web service client application is running.

RESOLUTION

To resolve this problem, you must use the Credentials property of the Web service client proxy to set the security credentials for Web service client authentication.

To set the Credentials property, do one of the following:

First Method
Assign the DefaultCredentials to the Credentials property of the Web Service Proxy class to call the Web service while Anonymous access authentication is turned off. The DefaultCredentials property of the CredentialCache class provides system credentials of the security context where the application is running. To do this, use the following code:

Visual C# .NET Sample

//Assigning DefaultCredentials to the Credentials property
//of the Web service client proxy (myProxy).
myProxy.Credentials= System.Net.CredentialCache.DefaultCredentials;
Visual Basic .NET Sample
'Assigning DefaultCredentials to the Credentials property
'of the Web service client proxy (myProxy).
myProxy.Credentials= System.Net.CredentialCache.DefaultCredentials

Second Method
You may also use the CredentialCache class to provide credentials for Web service client authentication. Create an instance of the CredentialCache class. Create an instance of NetworkCredential that uses the specified user name, password, and domain. Add the NetworkCredential to the CredentialCache class with the authentication type. To do this, use the following code:

Visual C# .NET Sample

//Create an instance of the CredentialCache class.
CredentialCache cache = new CredentialCache();
// Add a NetworkCredential instance to CredentialCache.
// Negotiate for NTLM or Kerberos authentication.
cache.Add( new Uri(myProxy.Url), "Negotiate", new NetworkCredential("UserName", "Password", "Domain")); 
//Assign CredentialCache to the Web service Client Proxy(myProxy) Credetials property.
myProxy.Credentials = cache;


Visual Basic .NET Sample

'Create an instance of the CredentialCache class.
Dim cache As CredentialCache = New CredentialCache()
'Add a NetworkCredential instance to CredentialCache.
'Negotiate for NTLM or Kerberos authentication.
cache.Add(New Uri(myProxy.Url), "Negotiate", New NetworkCredential("UserName", "Password", "Domain"))
'Assign CredentialCache to the Web service Client Proxy(myProxy) Credetials property.
myProxy.Credentials = cache
Note The CredentialCache class and the NetworkCredential class belong to the System.Net namespace.

For more information about how to set the Credentials property, see the "More Information" section in this article.

STATUS

This behavior is by design.

MORE INFORMATION

DefaultCredentials represents the system credentials for the current security context where the application is running. For a client-side application, the default credentials are typically the Windows credentials such as user name, password, and domain of the user who is running the program. For ASP.NET programs, the default credentials are the user credentials of the identity for the ASP.NET worker process, or the user who is being impersonated. In the following sample ASP.NET program, DefaultCredentials represents the ASPNET user account (or NetworkService user account for applications run on Microsoft Internet Information Services [IIS] 6.0) because no impersonation is set to the caller.
 

Steps to Reproduce the Behavior

1. Create a new ASP.NET Web Service by using Visual C# .NET or Visual Basic .NET.
2. Name the project WebServiceTest.
3. By default, Service1.asmx is created.
4. Uncomment the default WebMethod "HelloWorld()".
5. On Build menu, click Build Solution.
6. Turn off Anonymous access to WebServiceTest. To do this, follow these steps:
a. In Control Panel, double-click Administrative Tools.
b. Double-click Internet Information Services.
c. Expand Internet Information Services, and then locate the WebServiceTest virtual directory.
d. Right-click WebServiceTest, and then click Properties.
e. Click the Directory Security tab.
f. Under Anonymous access and authentication control, click Edit.
g. In the Authentication Methods dialog box, click to clear the Anonymous access check box.
h. Click to select the Integrated Windows authentication check box.

Note Verify that only Integrated Windows authentication is selected.
i. Click OK to close the Authentication Methods dialog box.
j. Click OK to close Properties.
7. On the Build menu, click Build Solution.
8. Type the following address in the browser to view the Service1 Web service description:
http://localhost/WebServiceTest/Service1.asmx
9. Test the HelloWorld WebMethod. The WebMethod works as expected.
10. Add a Web Reference to a test ASP.NET Web Application. To do this, follow these steps:
a. Create a new ASP.NET Web Application by using Visual C# .NET or Visual Basic .NET. Name the project WebServiceCaller.
b. By default, WebForm1.aspx is created.
c. In Solution Explorer, right-click References, and then click Add Web Reference.
d. In the Address text box, type the URL for WebServiceTest as follows:
http://localhost/WebServiceTest/Service1.asmx
e. Click Go or press ENTER, and then click Add Reference.
11. In Solution Explorer, right-click WebForm1.aspx, and then click View Code.
12. Append the following code to the Page_Load event:

Visual C# .NET Sample:
// Start an instance of the Web service client-side proxy.
localhost.Service1 myProxy = new localhost.Service1();
Response.Write( myProxy.HelloWorld());
Visual Basic .NET Sample:
'Start an instance of the Web service client-side proxy.
Dim myProxy As localhost.Service1 = New localhost.Service1()
Response.Write(myProxy.HelloWorld())
13. On the Debug menu, click Start, and then view the application in the browser.
14. The error message that is discussed in the "Symptoms" section appears in the browser.
15. To resolve this problem, assign DefaultCredentials to the Credentials property of the Web service client-side proxy. To do this, insert the following code before the line "Response.Write( myProxy.HelloWorld())":

Visual C# .NET Sample:
myProxy.Credentials= System.Net.CredentialCache.DefaultCredentials;
Visual Basic .NET Sample:
myProxy.Credentials = System.Net.CredentialCache.DefaultCredentials
16.

Repeat step 13

Login to add your contents and source code to this article
post comment
     

Hi Mahesh,

I am trying to hit a web request to a different site page programatically and handle the response accordingly. If that site page respond with a 401, i want to handle that response, add the returned headers to the current response, and again according to the user response to the current response, i want to pass the request again to the other site page. So , i want to handle the request/response commuication to that other site page as if user has hit the url in browser itself, until i get a final expected response from that page.

I an not sure, do we implement a http proxy in such cases? if yes (or otherwise), how i can go around it?

Thanks in advance... and yes.. nice site :)

Mahavir

Posted by mahavir patil Sep 18, 2008

There are many ways to pass parameters from one page to another. These ways are to store values in - Application State, Session State, View State, Cookies, and browser URL. So it depends on what you are trying to achieve, it can be done.

Please post all of your questions to discussion forums unless they are related to a specific article.

Posted by Mahesh Chand Feb 09, 2007

Hi, I went through the article. Its really great and would help lot of begineers like me to learn alot and give lot of information I have a similar kind of requirement Can we pass the username and password to a regular html page by using the credentials provided by .Net. Most of the time regular HTMl pages to require the authetication. Whn we want to call such page in code (Written in C#.Net) we won't be able to do so without passing the required parameters. Does anyone know hw to achieve this i.e., to make a call to the regular html pages by passing the required parameters by using the code written in C#.Net. My mail-id is apondu@gmail. please send in the suggestions and code snips at this id Thanks for the help Govardhana

Posted by Govardhana Reddy Feb 09, 2007
COMMENT USING
PREMIUM SPONSORS
Over-C is a holistic consortium of communications and technology specialists. We build, deploy and market both business as well as consumer products and solutions.
SPONSORED BY
  • PDF reports have never been easier to create. With our included WYSIWYG Designer, you can layout your reports, set up your data source and let DynamicPDF ReportWriter do the rest.