Sei que existem milhares de relatórios de pessoas com problemas para que a Autenticação Integrada do Windows funcione com o IIS, mas todas parecem levar a páginas da Web que não se aplicam ou soluções que eu já tentei. Eu já implantei dezenas de sites como esse antes, então, ou algo estranho está acontecendo com o servidor / configuração, ou eu estive olhando isso por muito tempo e não vendo o óbvio.
Simplificando, tudo funciona perfeitamente na minha máquina local, mas desmorona no servidor de produção, que, até onde eu sei, tem exatamente 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 sucesso, 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 a 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 a solicitação de desafio e permitem que eu faça login no domínio localhost com minha conta (local) do Windows.
- Todos os navegadores testados também funcionam usando um endereço IP local opaco - portanto, os próprios navegadores parecem não se importar se o site parece "local" ou "remoto".
- 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 fiz login).
Na máquina remota:
- O servidor está executando o Windows Server 2008 R2, IIS 7.5.
- Carregar a 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 prompt de desafio é exibido.
- A configuração do site do IIS tem todos os métodos de autenticação desativados, exceto a 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 da área de trabalho remota), o mesmo erro aparece no Internet Explorer, independentemente de o domínio ser host local ou o endereço IP externo.
- Se eu tentar visualizar o site remoto da minha máquina local , o erro ainda será 401, mas um 401 ligeiramente diferente. Nenhum subcódigo, com o texto: Acesso negado devido a credenciais inválidas.
- O recurso de função IIS de autenticação do Windows está instalado.
- O WindowsAuthentication Module é adicionado (no nível do servidor).
- O mesmo erro ocorre se eu desativar a autenticação do Windows e ativar a autenticação básica.
- O site faz carga se eu desligar a autenticação do Windows e permitir anônimo (obviamente).
- Eu 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 o que vejo é o seguinte aviso:
MODULE_SET_RESPONSE_ERROR_STATUS
ModuleName IIS Web
Notification 2
HttpStatus 401
HttpReason Não autorizado
HttpSubStatus 2
ErrorCode
2147942405
Notificação ConfigExceptionInfo AUTHENTICATE_REQUEST O
acesso ao ErrorCode foi negado. (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 NOTIFY_MODULE_START
linha com ModuleName
= WindowsAuthentication
(e vários outros eventos de acompanhamento do ASP.NET - [un] felizmente, sem erros ou avisos interessantes aqui).
Alguém pode me dizer o que posso estar perdendo aqui?
Rápida atualização:
Estou um pouco desconfortável enviando um dump completo do Wireshark, pois 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 -evident qual é o problema:
Localhost:
HTTP / 1.1 401 não autorizado Controle de cache: privado Tipo de Conteúdo: text / html; charset = utf-8 Servidor: Microsoft-IIS / 7.5 WWW-Authenticate: Negociate WWW-Authenticate: NTLM Desenvolvido por X: ASP.NET Data: sábado, 17 de dezembro de 2011 23:42:34 GMT Comprimento do conteúdo: 6399 Suporte de proxy: autenticação baseada em sessão
Controlo remoto:
HTTP / 1.1 401 não autorizado Tipo de Conteúdo: text / html Servidor: Microsoft-IIS / 7.5 Desenvolvido por X: ASP.NET Data: sábado, 17 de dezembro de 2011 23:43:13 GMT Comprimento do conteúdo: 1293
Além de algumas diferenças aparentemente irrelevantes, como controle de cache, a principal diferença é que o servidor remoto não está enviando os cabeçalhos WWW-Authenticate de volta ao cliente.
Portanto, acho que isso restringe 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?
fonte
Respostas:
Problema resolvido. Finalmente decidi comparar a lista de módulos lado a lado e realmente faltava uma. Acontece que existem dois módulos de autenticação do Windows:
No servidor, o
WindowsAuthentication
módulo gerenciado estava lá, mas não o nativoWindowsAuthenticationModule
destacado acima. Por que foi configurado dessa maneira é uma incógnita, mas, aparentemente, se o módulo nativo não estiver carregado, o módulo gerenciado será carregado alegremente e falhará silenciosamente.Portanto, para futuros leitores que encontrarem esse problema, verifique se os dois módulos foram carregados , pois o IIS não avisará se um deles estiver faltando.
fonte
Descobrimos que isso não corrigia necessariamente o problema para desenvolvedores que trabalham localmente em sites ASP.NET em execução na autenticação do Windows. Encontramos um hack do registro que desabilita a verificação de loopback; isso corrigiu: -
chave de registro - HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa
Crie um DWORD com o valor 1 chamado "DisableLoopbackCheck"
Você precisará reiniciar a máquina para que a configuração entre em vigor
fonte