Solucionando problemas de autenticação do Windows (sem desafio) no IIS 7.5?

20

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?

    
por Aaronaught 17.12.2011 / 22:11

2 respostas

13

Problema resolvido. Eu finalmente decidi comparar a lista de módulo lado a lado e realmente estava faltando uma. Acontece que existem dois módulos de autenticação do Windows:

No servidor, o módulo WindowsAuthentication gerenciado estava lá, mas não o nativo WindowsAuthenticationModule destacado acima. Por que foi configurado dessa forma, ninguém sabe, mas, aparentemente, se o módulo nativo não for carregado, o módulo gerenciado será carregado alegremente e falhará silenciosamente.

Portanto, para qualquer futuro leitor que encontrar este problema, certifique-se de ter os dois módulos carregados , porque o IIS não o avisará se um deles estiver faltando.

    
por 18.12.2011 / 01:21
4

Descobrimos que isso não corrigiu necessariamente o problema dos desenvolvedores que trabalham localmente em sites ASP.NET em execução na Autenticação do Windows. Encontramos um hack do registro que desativa a verificação de loopback; isso resolveu: -

chave de registro - HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa

Crie um DWORD com valor 1 chamado "DisableLoopbackCheck"

Você terá que reinicializar a máquina para que a configuração entre em vigor

    
por 30.08.2013 / 06:30