Recebendo prompt de login usando autenticação integrada do Windows


108

Eu tenho um aplicativo .NET 3.5 em execução no IIS 7 no servidor Windows 2003 e não consigo fazer a autenticação integrada do Windows funcionar corretamente, pois continuo a ser solicitado um login. Eu configurei a Autenticação do Windows para habilitada no IIS com todos os outros tipos de segurança desabilitados e a autenticação / autorização do arquivo web.config do meu aplicativo está configurada como:

<system.web>
    <compilation debug="true" strict="false" explicit="true" targetFramework="3.5" />
    <authenticationmode="Windows"/>
    <authorization>
    <deny users = "?" />
    </authorization>
</system.web>

Com essa configuração, espero que a verificação por trás da cena do usuário do Windows permita o acesso e negue a usuários anônimos. No entanto, o que estou recebendo é um pop-up de login do Windows quando tento acessar o site.

Estou solucionando esse problema há alguns dias e não consigo descobrir o problema. Com base em postagens com problemas semelhantes, confirmei que meu URL não inclui nenhum ponto, verifiquei duas vezes se minhas configurações do IE estão definidas para Habilitar autenticação integrada do Windows e também adicionei meu URL aos sites da minha intranet, mas ainda obtive o pop-up.

Para solucionar o problema ainda mais, habilitei a Autenticação anônima no IIS e modifiquei meu arquivo web.config para o qual me permite entrar e, em seguida, adicionei Response.Write (System.Security.Principal.WindowsIdentifity.getcurrent (). User.name.toString () ) para tentar ver qual usuário está sendo usado na autenticação. O resultado que estou obtendo é IIS APPPOOL \ myapp, que obviamente é o pool de aplicativos IIS para meu aplicativo.

Eu realmente aprecio qualquer ajuda que alguém possa fornecer para que eu ainda esteja usando apenas a autenticação do Windows, mas não receba o pop-up e a autenticação do Windows seja executada contra o usuário real do Windows.

Obrigado.


Observação adicional após a solução de problemas adicionais:

Só notei que quando o login falha e o prompt de login do Windows é exibido novamente, ele está mostrando o nome de usuário que tentou fazer o login como "SERVERNAME" \ "USERNAME" o que me levou a acreditar que ele estava tentando validar o usuário contra o servidor vs. domínio. Para confirmar isso, criei uma conta de usuário local diretamente no servidor do aplicativo com o mesmo nome de usuário e senha do usuário do domínio de rede e tentei fazer o login novamente. O resultado foi que recebi o prompt de login novamente, mas quando digitei o nome de usuário e a senha desta vez, consegui fazer o login com sucesso. O usuário da rede e o servidor de aplicativos estão no mesmo domínio, então não tenho certeza de por que a autenticação do IIS está apontando para as contas do servidor de aplicativos locais e não para as contas de domínio. Eu percebi que esta é uma questão do IIS neste momento, então postando no forums.iis.


4
Deve haver um espaço entre autenticação e modo, como: <authentication mode="Windows" />Espero que tenha sido apenas um erro de digitação em sua pergunta?
Sean Hanley

3
Você está executando o iis 7 no servidor 2003, tem certeza que tenho quase certeza de que isso não é possível.
Anicho

Respostas:


86

Tenho um servidor Windows 2008 no qual estou trabalhando, portanto, minha resposta não é completamente igual à que o OP tem em um servidor Windows 2003.

Aqui está o que eu fiz (registrando isso aqui para que possa encontrar mais tarde).

Eu estava tendo o mesmo problema:

prompt de login

No meu arquivo Web.config , eu tinha esta seção:

<system.web>
    <authentication mode="Windows" />
    <authorization>
        <allow users="*" />
        <deny users="?" />
    </authorization>
</system.web>

No IIS, tudo isso parece ser resolvido no ícone Autenticação .

  1. Editar Permissões: Certifique-se de que sua conta ASP.NET tenha permissão. O meu não foi adicionado originalmente.

Permissão ASP.NET

Agora vá para os recursos de autenticação :

Recursos de autenticação

Habilite a autenticação anônima com IUSR:

Autenticação Anônima

Habilite a autenticação do Windows e clique com o botão direito para definir os provedores .

O NTLM precisa ser PRIMEIRO!

Autenticação Windows

Em seguida, verifique se em Configurações Avançadas ... a Proteção Estendida está Aceitar e Habilitar autenticação no modo Kernel está VERIFICADA:

Configurações avançadas

Depois de fazer isso, voltei ao meu aplicativo da web, cliquei no link Procurar e efetuei o login sem precisar fornecer minhas credenciais novamente.

Espero que isso seja benéfico para muitos de vocês, e espero que seja útil para mim também mais tarde.


1
Obrigado, Sujay. Percebi que a maioria dessas técnicas no SO carecem de fotos para mostrar do que estão falando, então quis mostrar todos os passos que usei. Se isso não funcionar para alguém, pelo menos eles podem ver todas as etapas que realizaram e que outras opções tentar.
jp2code

1
Isso é incrível! Estou ficando louco por causa disso. E as fotos tornaram tudo muito mais fácil. OBRIGADO!!
KratosMafia

1
Funcionou para mim também, mas tive que reiniciar minha instância do Windows 2008 r2 no final. Acho que pode ser importante mencioná-lo.
Aleksei Mialkin

6
não funciona para Windows Server 2012 executando IIS 8.5
Minh Nguyen

3
Isso não permite apenas a autenticação anônima, permitindo que a autenticação do Windows seja ignorada? Pergunta genuína, é assim que o acima parece para mim.
Paul Hodgson

49

Apenas para o benefício de outras pessoas. Se o erro for um 401.1 Unauthorizede seu código de erro corresponder 0xc000006d, você está realmente encontrando um "recurso" de segurança que bloqueia solicitações ao FQDN ou cabeçalhos de host personalizados que não correspondem ao nome da máquina local:

Siga este artigo de suporte para corrigir o problema:

https://webconnection.west-wind.com/docs/_4gi0ql5jb.htm (original, agora extinto: http://support.microsoft.com/kb/896861 )

No artigo de suporte, para garantir que ele não se perca:

A solução alternativa é um hack do registro que desabilita essa política explicitamente.

Para realizar essa configuração manualmente, encontre essa chave no registro do servidor:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa

e edite ou adicione uma nova chave:

DisableLoopbackCheck (DWORD)

em seguida, enviou o valor para 1 para desabilitar a verificação de loopback (a autenticação local funciona) ou para 0 (a autenticação local não é permitida).

Ou, mais facilmente, você pode usar o Powershell:

New-ItemProperty HKLM:\System\CurrentControlSet\Control\Lsa -Name "DisableLoopbackCheck" -Value "1" -PropertyType dword

Parece que compilações recentes do Windows 10 (1803 e posterior?) Também exigem essa definição de configuração para autenticar localmente.

Este me levou um pouco porque os comentários de todos os outros aqui não me ajudaram. Eu encontrei este artigo e ele consertou!


3
Você senhor é meu herói f * g! Já passei por tantas "soluções" para chegar a isso. Obrigado!
dewd

1
Vaca sagrada! dois dias tentando colocar isso para funcionar, e finalmente você me deu a resposta! obrigado!
BernieSF

1
Depois de analisar várias respostas e ver que a configuração era idêntica à minha, esta foi a resposta!
Sietse

1
Sua lenda! Isso funcionou para mim. Passei muito tempo descobrindo isso.
Andy Vennells

2
@PTD Atualizado com novo artigo e resumo adicionado para a posteridade para que não se perca. Tanto para permalinks de suporte MS!
Kamranicus

26

Eu tive um problema semelhante, em que queria proteger apenas uma parte do meu site. Tudo funcionou bem, exceto no IE. Tenho a autenticação anônima e a autenticação do Windows ativadas. Para anônimo, a identidade é definida como a identidade do pool de aplicativos. O problema era com a autenticação do Windows. Depois de pesquisar um pouco, liguei o fiddler e descobri que ele estava usando o Kerberos como provedor (na verdade, ele está definido como Negociar por padrão). Troquei para NTLM e isso consertou. HTH

Daudi


1
Isso é feito para mim, obrigado! Consegui identificar o usuário do Windows ao acessar localmente, mas a solicitação de credenciais surgia de qualquer outra máquina no domínio.
JSancho

1
@Daudi Como você define a identidade por método de autenticação?
Rob Bell

18

Adicione permissão [Usuários do domínio] à sua segurança na web.

  • Clique com o botão direito no seu site no IIS na pasta Sites
  • Clique em Editar Permissões ...
  • Selecione a guia Segurança
  • Na seção Grupo ou nomes de usuário, clique no botão Editar ...
  • Na janela pop-up Permissões, nos nomes de grupo ou usuário, clique em Adicionar ...
  • Insira [Usuários do domínio] nos nomes dos objetos para selecionar a área de texto e clique em OK para aplicar a mudança
  • Clique em OK para fechar o pop-up de Permissões
  • Clique em OK para fechar o pop-up Propriedades e aplicar suas novas configurações

10
Passos sobre como fazer isso seriam úteis.
Drew Chapin de

2
+1. Você salvou meu dia e minha sanidade. Muito apreciado!
stakx - não contribuindo mais em

11

Não cometa erros em seu servidor mudando tudo. Se você tiver o prompt do Windows para fazer logon ao usar a Autenticação do Windows no 2008 R2, vá para Providerse mova NTLMpara CIMA para cada aplicativo. Quando Negotiateé o primeiro na lista, a Autenticação do Windows pode parar de funcionar para a propriedade de um aplicativo específico no 2008 R2 e você pode ser solicitado a inserir o nome de usuário e a senha para nunca funcionar. Isso às vezes acontece quando você atualiza seu aplicativo. Apenas certifique-se de que NTLMé o primeiro da lista e você nunca verá esse problema novamente.


1
Isso consertou para mim.
Bigwave de

9
A menos, é claro, que você não queira o NTLM em primeiro lugar na sua lista ... há consequências para essa ação, qualquer pessoa que fizer essa alteração deve entender a diferença entre NTLM e Negotiate (no nível mais básico, Negotiate primeiras tentativas de autenticação Kerberos e quedas de volta ao NTLM se isso falhar). Se você deseja o Kerberos (e muitos desejam), essa não é uma boa solução. Alguns detalhes aqui: msdn.microsoft.com/en-us/library/aa480475.aspx
TCC

8

Se o seu URL tiver pontos no nome de domínio, o IE o tratará como um endereço de Internet e não local. Você tem pelo menos duas opções:

  1. Obtenha um alias para usar na URL para substituir server.domain. Por exemplo, myapp.
  2. Siga as etapas abaixo no seu computador.

Vá para o site e cancele a caixa de diálogo de login. Deixe isso acontecer:

insira a descrição da imagem aqui

Nas configurações do IE:

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui


1
Estamos usando o Windows Server 2012 e esta é a única solução que funcionou para nós. Muito obrigado!
ashilon

5

WindowsIdentity.GetCurrentestá correto: você deve obter o usuário APPPOOL. Isso ocorre porque o processo ASP.NET, que está executando seu código, é a identidade atual. Se quiser que o usuário retorne a identidade do site, será necessário adicionar a seguinte linha em seu web.config:

<identity impersonate="true" />

Isso faz com que o processo assuma a identidade do usuário que está solicitando a página. Todas as ações serão executadas em seu nome, portanto, qualquer tentativa de ler pastas na rede ou acessar recursos de banco de dados e similares significará que o usuário atual precisará de permissões para essas coisas. Você pode ler mais sobre falsificação de identidade aqui . Observe que, dependendo de como a topologia do servidor da web / banco de dados está configurada, você pode ter problemas de delegação com a representação ativada.

Mas o seu problema original é que parece que a identidade não pode ser determinada e você está recebendo um pop-up de login. Observarei que você não precisa do <deny>bloqueio se tiver desabilitado a autenticação anônima no IIS. Nós nunca o incluímos (exceto em <location>blocos especiais e outros), então eu diria que você pode tentar removê-lo e tentar novamente. Tudo o resto parece certo, no entanto.

Você não especificou qual usuário está executando o pool de aplicativos no IIS. É uma conta personalizada ou padrão? Se for personalizado, é uma conta de domínio ou uma conta local no servidor web? Às vezes, contas personalizadas podem exigir mais algumas etapas, como registrar um SPN. Além disso, pode ser um problema com a conta personalizada não ter permissão no AD para resolver a conta de entrada do usuário.

Você também pode verificar os logs do IIS para ver qual resposta está sendo retornada. Provavelmente será um 401, mas deve ter um subnúmero depois dele, como 401,2 ou algo assim. Às vezes, esse subnúmero pode ajudar a determinar a raiz do problema. Este artigo da base de conhecimento lista cinco.


+1 por mencionar a necessidade de um SPN. Na verdade, a maioria dos problemas que enfrentei com pop-ups de login era devido à falta de um SPN em um ambiente Kerberos.
SBS de

5

Isso consertou para mim.

Meu servidor e cliente PC são Windows 7 e estão no mesmo domínio

  1. em iis7.5 - habilite a autenticação do Windows para sua Intranet (desabilite todas as outras autenticações .. também não há necessidade de mencionar a autenticação do Windows no arquivo web.config

  2. em seguida, vá para o PC cliente .. IE8 ou 9- Ferramentas-Internet Opções-Segurança-Intranet local-Sites-avançado-Adicione seu site (tire a marca de tíquete "Exigir verfi do servidor ..." ... não há necessidade

  3. IE8 ou 9- Ferramentas-Internet Opções-Segurança-Intranet local-Nível personalizado-userauthentication-logon-select logon automático com nome de usuário e senha atuais

  4. salve essas configurações ... você está pronto ... Não há mais solicitações de nome de usuário e senha.

  5. Certifique-se de que, como seu PC cliente faz parte do domínio, você precisa de um GPO para essas configurações, ou então, essa configuração será revertida quando o usuário fizer login no Windows na próxima vez


2
Para 1) Ativei a representação e a autenticação do Windows e tudo correu bem. A chave para mim era 2) onde você adiciona o endereço do site remoto à zona da intranet local.
SideFX

4

Pode ser relacionado ao navegador. Se você estiver usando o Internet Explorer, vá para Configurações avançadas e marque a caixa de seleção "Ativar autenticação integrada do Windows".


4

No meu caso, as configurações de autorização não foram configuradas corretamente.

Eu precisei

  1. abra as Regras de Autorização .NET no Gerenciador do IIS

    abra as Regras de Autorização .NET no Gerenciador do IIS
  2. e remover a regra de negação

    remova a regra de negação

3

Em nossa intranet, o problema foi resolvido no lado do cliente ajustando as configurações de segurança conforme mostrado aqui. Qualquer uma das caixas de seleção à direita funcionou para nós.

Opções de Internet do IE


2

Acabei de resolver um problema semelhante com um aplicativo ASP.Net.

Sintomas: eu poderia fazer login em meu aplicativo usando um usuário local, mas não um usuário de domínio, mesmo se a máquina estivesse conectada corretamente ao domínio (como você diz em sua Nota Adicional). No visualizador de eventos de segurança, houve um evento com ID = 4625 "Domain sid inconsistent".

Solução: encontrei a solução aqui . O problema era que minhas máquinas de teste eram máquinas virtuais clonadas (Windows Server 2008 R2; um controlador de domínio e um servidor web). Ambos tinham o mesmo SID de máquina, o que aparentemente causou problemas. Aqui está o que eu fiz:

  1. Remova o servidor web do domínio.
  2. Execute c: \ Windows \ System32 \ Sysprep \ Sysprep.exe na VM.
  3. Reinicialize a VM.
  4. Junte o servidor da web ao domínio.

Você perde algumas configurações no processo (preferências do usuário, IP estático, recriar o certificado autoassinado), mas agora que eu os recriei, tudo está funcionando corretamente.


A clonagem é uma droga quando você tenta configurar a delegação restrita.
SideFX

2

Eu também tive o mesmo problema. Tentei a maioria das coisas encontradas neste e em outros fóruns.

Finalmente tive sucesso depois de fazer um pouco do próprio RnD.

Entrei nas configurações do IIS e, em seguida, nas opções de permissão do meu site , adicionei meu grupo de usuários do domínio Organizations.

Agora, como todos os usuários do meu domínio tiveram acesso ao site, não encontrei esse problema.

Espero que isto ajude


4
De quais opções de permissão você está falando? Você pode fornecer etapas mais detalhadas sobre o que você fez?
Drew Chapin de

1

Você já tentou fazer login com o prefixo do seu domínio, por exemplo, DOMÍNIO \ Nome de usuário? O padrão do IIS 6 é usar o computador host como o domínio padrão, portanto, especificar o domínio no logon pode resolver o problema.


1

Eu tentei os truques de configuração do IIS acima e o hack do registro de loopback, e revisei e recriei as permissões do pool de aplicativos e uma dúzia de outras coisas e ainda não consegui me livrar do loop de autenticação em execução na minha estação de trabalho de desenvolvimento com IIS Express ou IIS 7.5, a partir de uma sessão de navegação local ou remota. Recebi quatro respostas de status 401.2 e uma página em branco. O mesmo site implantado em meu servidor de teste do IIS 8.5 funciona perfeitamente.

Por fim, notei que a marcação no corpo da resposta foi deixada em branco pelo navegador e continha a página padrão para um login bem-sucedido. Concluí que o tratamento de erros personalizados para ASP.NET e HTTP para o erro 401 estava impedindo / interferindo na autenticação do Windows em minha estação de trabalho mas não o servidor de teste. Passei várias horas mexendo nisso, mas assim que removi o tratamento personalizado apenas para o erro 401, a estação de trabalho voltou ao normal. Apresento isso como mais uma maneira de atirar no próprio pé.


0

A autenticação do Windows no IIS7.0 ou IIS7.5 não funciona com kerberos (provedor = Negociar) quando a identidade do pool de aplicativos é ApplicationPoolIdentity. É necessário usar o Serviço de Rede ou outra conta integrada. Outra possibilidade é usar NTLM para fazer a Autenticação do Windows funcionar (em Autenticação do Windows, Provedores, colocar NTLM no topo ou remover negociação)

chris van de vijver


3
Incorreta. Reinicialize seu servidor. Observe que funciona agora. Aplique o Hotfix KB2545850.
Amit Naidu

Uau. Reinicializar apenas consertou para mim. Precisa verificar agora por quanto tempo. Alguma ideia? Não investigou o Hotfix ainda.
mplwork de

tivemos absolutamente o mesmo caso - o Negotiate não funcionou com ApplicationPoolIdentity até a reinicialização.
SergeyT

0

Tive o mesmo problema porque o usuário (Identidade) que usei no pool de aplicativos não estava abaixo do grupo IIS_IUSRS. Adicionou o usuário ao grupo e tudo funcionou


0

No meu caso, a solução foi (além dos ajustes sugeridos acima) reiniciar o computador de desenvolvimento local / IIS (servidor de hospedagem) do meu / dos usuários. Meu usuário acabou de ser adicionado ao grupo de segurança AD recém-criado - e a política não se aplicava à conta do usuário AD até que eu desconectasse / reiniciei meu computador.

Espero que isso ajude alguém.


0

Eu encontrei o mesmo problema de solicitação de credencial e fiz uma pesquisa rápida e nada na internet resolveria. Demorou algum tempo para encontrar o problema, um problema bobo.

No IIS -> Configuração Avançada -> Credencial do Caminho Físico (está vazio)

Assim que adicionasse uma ID de máquina (domínio / usuário) que tivesse acesso à VM / servidor, a solicitação de senha parava.

Espero que isto ajude


0

Eu estava tendo esse problema no .net core 2 e depois de passar pela maioria das sugestões daqui, parece que perdemos uma configuração no web.config

<aspNetCore processPath="dotnet" arguments=".\app.dll" forwardWindowsAuthToken="false" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />

A configuração correta era forwardWindowsAuthToken = "true" que parece óbvio agora, mas quando há tantas situações para o mesmo problema, é mais difícil identificar

Edit: também achei útil o seguinte artigo do Msdn que aborda a solução do problema.


-1

Eu tive o mesmo problema e foi resolvido alterando a identidade do pool de aplicativos do pool de aplicativos sob o qual o aplicativo da web está sendo executado para NetworkService insira a descrição da imagem aqui

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.