Compartilhar via


Acesso negado Quando você chama um serviço Web enquanto a autenticação anônima está desativada

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.

  1. Crie um novo serviço Web ASP.NET usando Visual C# .NET ou Visual Basic .NET.

  2. Nomeie o projeto WebServiceTest.

  3. Por padrão, Service1.asmx é criado.

  4. Remova o comentário do WebMethod padrão "HelloWorld()".

  5. No menu Compilar, selecione Compilar Solução.

  6. Desative o acesso anônimo ao WebServiceTest. Para fazer isso, siga estas etapas:

    1. No Painel de Controle, clique duas vezes em Ferramentas Administrativas.

    2. Clique duas vezes em Serviços de Informações da Internet.

    3. Expanda Serviços de Informações da Internet e localize o diretório virtual WebServiceTest .

    4. Clique com o botão direito do mouse em WebServiceTest e selecione Propriedades.

    5. Selecione a guia Segurança de Diretório.

    6. Em Controle de acesso e autenticação anônimos, selecione Editar.

    7. Na caixa de diálogo Métodos de Autenticação, selecione para desmarcar a caixa de seleção Acesso anônimo.

    8. 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.

    9. Selecione OK para fechar a caixa de diálogo Métodos de autenticação .

    10. SelecioneOKpara fechar Propriedades.

  7. No menu Build, selecione Compilar Solução.

  8. Digite o seguinte endereço no navegador para exibir a descrição do serviço Web Service1:

    http://localhost/WebServiceTest/Service1.asmx

  9. Teste o HelloWorld WebMethod. O WebMethod funciona conforme o esperado.

  10. Adicione uma referência da Web a um aplicativo Web de ASP.NET teste. Para fazer isso, siga estas etapas:

    1. Crie um novo aplicativo Web ASP.NET usando Visual C# .NET ou Visual Basic .NET. Nomeie o projeto WebServiceCaller.

    2. Por padrão, WebForm1.aspx é criado.

    3. No Gerenciador de Soluções, clique com o botão direito do mouse em Referências e selecione Adicionar Referência da Web.

    4. Na caixa de texto Endereço , digite a URL para WebServiceTest da seguinte maneira:

      http://localhost/WebServiceTest/Service1.asmx

    5. Selecione Ir ou pressione ENTER e, em seguida, selecione Adicionar Referência.

  11. No Gerenciador de Soluções, clique com o botão direito do mouse em WebForm1.aspx e selecione Exibir Código.

  12. 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())
    
  13. No menu Depurar , selecione Iniciar e exiba o aplicativo no navegador.

  14. A mensagem de erro discutida na seção "Sintomas" aparece no navegador.

  15. 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
    
  16. Repita a etapa 13.

Referências