Eu sei que há milhares de relatórios de pessoas com problemas para obter a Autenticação Integrada do Windows para funcionar com o IIS, mas todas elas levam a páginas da Web que não se aplicam ou soluções que eu já experimentei. Eu já implantei dezenas de sites como este antes, então ou há algo bizarro acontecendo com o servidor / configuração, ou eu tenho olhado isso por muito tempo e não vejo o óbvio.
Simplificando, tudo funciona perfeitamente na minha máquina local, mas desmorona no servidor de produção, o que, até onde eu sei, tem a mesma configuração .
Na máquina local:
- A máquina está executando o Windows 7 Ultimate, Service Pack 1, IIS 7.5.
- O site foi testado com êxito, usando o IIS e o VS Web Development Server.
- A configuração do site do IIS tem todos os métodos de autenticação desativados exceto Autenticação do Windows.
- A máquina local não está em nenhum domínio.
- Os provedores configurados são Negociar e NTLM (não negociar: Kerberos).
- A proteção estendida está desativada.
- Todos os navegadores testados (IE, Firefox, Chrome) mostram o prompt de desafio e permitem que eu faça login no domínio localhost com minha conta do Windows (local).
- Todos os navegadores testados também funcionam usando um endereço IP local opaco - portanto, os próprios navegadores não parecem se importar se o site parece "local" ou "remoto".
- Eu adicionei uma linha de exibição à página da web que mostra o usuário conectado no momento e mostra exatamente o que eu esperaria (qualquer usuário local com o qual eu fiz login).
Na máquina remota:
- O servidor está executando o Windows Server 2008 R2, IIS 7.5.
- O carregamento da página da Web resulta em um erro 401.2 imediato : Você não está autorizado a visualizar esta página devido a cabeçalhos de autenticação inválidos. Nenhum aviso de desafio aparece .
- A configuração do site do IIS tem todos os métodos de autenticação desativados exceto Autenticação do Windows.
- A máquina remota não está em nenhum domínio.
- Os provedores configurados são Negociar e NTLM (não negociar: Kerberos).
- A proteção estendida está desativada.
- Na máquina remota (sessão de área de trabalho remota), o mesmo erro aparece no Internet Explorer, independentemente de o domínio ser localhost ou o endereço IP externo.
- Se eu tentar visualizar o site remoto da minha máquina local , o erro ainda é 401, mas um 401 ligeiramente diferente. Nenhum subcódigo, com o texto: O acesso é negado devido a credenciais inválidas.
- O recurso Autenticação do Windows IIS está instalado.
- O WindowsAuthentication Módulo é adicionado (no nível do servidor).
- O mesmo erro ocorre quando desativo a Autenticação do Windows e habilito a Autenticação Básica.
- O site é carregado se eu desativar a Autenticação do Windows e ativar Anônimo (obviamente).
- Já segui todas as etapas de solução de problemas no Suporte da Microsoft: Solução de problemas de erros HTTP 401 no IIS
- Eu já tentei a solução alternativa mostrada em outra página de suporte da Microsoft (supostamente para forçar o NTLM como o único método) .
Por último, mas não menos importante, tentei ativar o FREB para erros 401.2 e os resultados não parecem me dizer nada de útil, tudo que vejo é o seguinte aviso:
MODULE_SET_RESPONSE_ERROR_STATUS
ModuleName IIS Web Core
Notification 2
HttpStatus 401
HttpReason Unauthorized
HttpSubStatus 2
ErrorCode 2147942405
ConfigExceptionInfo
Notification AUTHENTICATE_REQUEST
ErrorCode Access is denied. (0x80070005)
... isso parece estar me dizendo o que eu já sei (que é simplesmente rejeitar a solicitação em vez de negociar as credenciais).
O rastreamento indica que o módulo WindowsAuthentication está carregado corretamente porque há uma linha NOTIFY_MODULE_START
com ModuleName
= WindowsAuthentication
(e vários outros eventos de acompanhamento do ASP.NET - [un] felizmente, sem erros interessantes ou avisos aqui).
Alguém pode me dizer o que eu poderia estar perdendo aqui?
Atualização rápida:
Sinto-me um pouco desconfortável ao enviar um despejo Wireshark inteiro, pois ele revelaria IPs, URLs e outras coisas, mas fiz uma comparação lado-a-lado das respostas HTTP do localhost e do servidor remoto no Fiddler, e parece bastante auto-evidente qual é o problema:
Localhost:
HTTP/1.1 401 Unauthorized
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/7.5
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
X-Powered-By: ASP.NET
Date: Sat, 17 Dec 2011 23:42:34 GMT
Content-Length: 6399
Proxy-Support: Session-Based-Authentication
Remoto:
HTTP/1.1 401 Unauthorized
Content-Type: text/html
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Sat, 17 Dec 2011 23:43:13 GMT
Content-Length: 1293
Além de algumas diferenças aparentemente inconseqüentes, como o controle de cache, a principal diferença é que o servidor remoto não está enviando os cabeçalhos WWW-Authenticate de volta ao cliente.
Então, acho que isso reduz a pergunta a: Por que o IIS não está enviando cabeçalhos WWW-Authenticate quando a autenticação do Windows parece estar instalada, carregada e ativada exclusivamente?