Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo ajuda a resolver erros (Acesso negado) que ocorrem quando você chama um aplicativo de serviço Web e a autenticação de acesso anônimo está desativada.
Versão original do produto: Aprimoramentos de serviços da Web
Número original do KB: 811318
Sintomas
Quando você tenta chamar um aplicativo de serviço Web e a autenticação de acesso anônimo está desativada, você pode receber a seguinte mensagem de erro:
A solicitação falhou com o status HTTP 401: Acesso negado.
Descrição: ocorreu uma exceção sem tratamento durante a execução da solicitação da Web atual. Examine o rastreamento de pilha para obter mais informações sobre o erro e em que ponto ele ocorreu no código.
Detalhes da exceção: System.Net.WebException: a solicitação falhou com o status HTTP 401: acesso negado.
Causa
Quando a autenticação de acesso anônimo é desativada para o aplicativo de serviço Web, todos os aplicativos chamadores devem fornecer as credenciais antes de fazer qualquer solicitação. Por padrão, o proxy do cliente de serviço da Web não herda as credenciais do contexto de segurança em que o aplicativo cliente do serviço da Web está sendo executado.
Para resolver esse problema, você deve usar a propriedade Credentials do proxy do cliente do serviço Web para definir as credenciais de segurança para a autenticação do cliente do serviço Web.
Para definir a propriedade Credentials, use uma das seguintes resoluções:
Resolução 1: Atribuir DefaultCredentials à propriedade Credentials
Atribua o DefaultCredentials à propriedade Credentials da classe Proxy de Serviço Web para chamar o serviço Web enquanto a autenticação de acesso anônimo estiver desativada. A propriedade DefaultCredentials da classe CredentialCache fornece credenciais do sistema do contexto de segurança em que o aplicativo está sendo executado. Para fazer isso, use o seguinte código:
Exemplo do Visual C# .NET
//Assigning DefaultCredentials to the Credentials property
//of the Web service client proxy (myProxy).
myProxy.Credentials= System.Net.CredentialCache.DefaultCredentials;
Exemplo do Visual Basic .NET
'Assigning DefaultCredentials to the Credentials property
'of the Web service client proxy (myProxy).
myProxy.Credentials= System.Net.CredentialCache.DefaultCredentials
Resolução 2: Usar a classe CredentialCache
Você pode usar a classe CredentialCache para fornecer credenciais para autenticação de cliente de serviço Web. Crie uma instância da classe CredentialCache. Crie uma instância de NetworkCredential que use o nome de usuário, a senha e o domínio especificados. Adicione o NetworkCredential à classe CredentialCache com o tipo de autenticação. Para fazer isso, use o seguinte código:
Exemplo do Visual C# .NET
//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;
Exemplo do Visual Basic .NET
'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
Observação
A classe CredentialCache e a classe NetworkCredential pertencem ao namespace System.Net.
Para obter mais informações sobre como definir a propriedade Credentials, consulte a seção Etapas para reproduzir o comportamento neste artigo.
Status
Este comportamento ocorre por design.
Etapas para reproduzir o comportamento
DefaultCredentials representa as credenciais do sistema para o contexto de segurança atual em que o aplicativo está sendo executado. Para um aplicativo do lado do cliente, as credenciais padrão normalmente são as credenciais do Windows, como nome de usuário, senha e domínio do usuário que está executando o programa. Para programas ASP.NET, as credenciais padrão são as credenciais de usuário da identidade para o processo de trabalho ASP.NET ou o usuário que está sendo representado. No programa ASP.NET exemplo a seguir, DefaultCredentials representa a conta de usuário ASPNET (ou conta de usuário NetworkService para aplicativos executados no Microsoft Internet Information Services [IIS] 6.0) porque nenhuma representação é definida como o chamador.
Crie um novo serviço Web ASP.NET usando Visual C# .NET ou Visual Basic .NET.
Nomeie o projeto WebServiceTest.
Por padrão, Service1.asmx é criado.
Remova o comentário do WebMethod padrão "HelloWorld()".
No menu Compilar, selecione Compilar Solução.
Desative o acesso anônimo ao WebServiceTest. Para fazer isso, siga estas etapas:
No Painel de Controle, clique duas vezes em Ferramentas Administrativas.
Clique duas vezes em Serviços de Informações da Internet.
Expanda Serviços de Informações da Internet e localize o diretório virtual WebServiceTest .
Clique com o botão direito do mouse em WebServiceTest e selecione Propriedades.
Selecione a guia Segurança de Diretório.
Em Controle de acesso e autenticação anônimos, selecione Editar.
Na caixa de diálogo Métodos de Autenticação, selecione para desmarcar a caixa de seleção Acesso anônimo.
Selecione para marcar a caixa de seleção Autenticação integrada do Windows.
Observação
Verifique se apenas a autenticação integrada do Windows está selecionada.
Selecione OK para fechar a caixa de diálogo Métodos de autenticação .
SelecioneOKpara fechar Propriedades.
No menu Build, selecione Compilar Solução.
Digite o seguinte endereço no navegador para exibir a descrição do serviço Web Service1:
http://localhost/WebServiceTest/Service1.asmx
Teste o HelloWorld WebMethod. O WebMethod funciona conforme o esperado.
Adicione uma referência da Web a um aplicativo Web de ASP.NET teste. Para fazer isso, siga estas etapas:
Crie um novo aplicativo Web ASP.NET usando Visual C# .NET ou Visual Basic .NET. Nomeie o projeto WebServiceCaller.
Por padrão, WebForm1.aspx é criado.
No Gerenciador de Soluções, clique com o botão direito do mouse em Referências e selecione Adicionar Referência da Web.
Na caixa de texto Endereço , digite a URL para WebServiceTest da seguinte maneira:
http://localhost/WebServiceTest/Service1.asmx
Selecione Ir ou pressione ENTER e, em seguida, selecione Adicionar Referência.
No Gerenciador de Soluções, clique com o botão direito do mouse em WebForm1.aspx e selecione Exibir Código.
Anexe o seguinte código a thePage_Loadevent:
Exemplo do Visual C# .NET:
// Start an instance of the Web service client-side proxy. localhost.Service1 myProxy = new localhost.Service1(); Response.Write( myProxy.HelloWorld());
Exemplo do Visual Basic .NET:
'Start an instance of the Web service client-side proxy. Dim myProxy As localhost.Service1 = New localhost.Service1() Response.Write(myProxy.HelloWorld())
No menu Depurar , selecione Iniciar e exiba o aplicativo no navegador.
A mensagem de erro discutida na seção "Sintomas" aparece no navegador.
Para resolver esse problema, atribua DefaultCredentials à propriedade Credentials do proxy do lado do cliente do serviço Web. Para fazer isso, insira o seguinte código antes da linha "Response.Write( myProxy.HelloWorld())":
Exemplo do Visual C# .NET:
myProxy.Credentials= System.Net.CredentialCache.DefaultCredentials;
Exemplo do Visual Basic .NET:
myProxy.Credentials = System.Net.CredentialCache.DefaultCredentials
Repita a etapa 13.