2012-10-02 76 views
20

Estoy creando una aplicación interna simple para mi empresa y requiere autenticación de Windows para seguridad. Todos los demás modos de autenticación están deshabilitados. Estoy atascado en una situación en la que Internet Explorer solicita las credenciales de 3 veces, y luego produce este error:Error de autenticación de Windows en IIS 7.5

Not Authorized

HTTP Error 401. The requested resource requires user authentication.

Entonces creó un sitio web escueto para probar esto. Creé un nuevo sitio en IIS, lo puse en su propio puerto (: 8111, elegido al azar), puse un archivo estático "default.htm" allí, deshabilité la autenticación anónima, luego habilité la autenticación de Windows. Todo lo demás quedó en la configuración predeterminada. El número de puerto fue asignado porque tenemos varios sitios en esta máquina que comparten la misma IP.

Éstos son algunos escenarios:

  • Navegación desde el propio servidor web, a la dirección http: // localhost : 8111/works bien

  • Mostrando del otro equipo, a http : // ServerIpAddress: 8111/ funciona bien

  • Mostrando del anot su computadora, a http: // ServerName : 8111/FALLA (pide las credenciales de 3 veces, y luego da error 401)

He estado buscando en línea y tratando de encontrar una solución sin suerte hasta ahora. O no lo he encontrado, o no entiendo lo que estoy leyendo. Cualquier ayuda sería muy apreciada.

Respuesta

38

Acabo de encontrar la solución con la ayuda de un compañero de trabajo después de 2 días de luchar contra este problema. Esto es lo que escribió:

There are 2 providers for Windows Authentication (Negotiate and NTLM). When setting the Website Authentication to Windows Authentication, while Windows Authentication is highlighted, click on the Providers link on the right pane or IIS Manager and move NTLM to the top. By default Negotiate is on top which is why you are getting an authentication prompt.

+1

+1 Eso lo hizo por mí, aunque una respuesta más profunda y más profunda sería investigar por qué fallaba Negotiate esto hace resaltar rápidamente lo que está mal. – Seph

+0

perdió medio día debido a esto. Gracias por la corrección. – learnerplates

+0

Esto también me solucionó. En mi caso, recibí el error 504 Gateway Timeout. –

17

Error 401.1 cuando navega por un sitio web que utiliza la Autenticación integrada.

Solución

desactivar la comprobación de bucle invertido

* In Registry Editor, locate and then click the following registry key: 

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa

* Right-click Lsa, point to New, and then click DWORD Value. 
* Type DisableLoopbackCheck, and then press ENTER. 
* Right-click DisableLoopbackCheck, and then click Modify. 
* In the Value data box, type 1, and then click OK. 

http://support.microsoft.com/kb/896861

+0

¡Gracias! Esto funcionó para mí y estoy aliviado de la agonía y la frustración del desarrollador durante las últimas horas. –

+0

Gracias por esto. Acabo de echar un vistazo y vi esta edición de registro. Cuando el arreglo NTLM anterior no funciona, recomiendo que este sea el próximo paso definitivo. ¡Simplemente validé muchas horas de trabajo que he pasado tratando de resolver esto! – JTester

+0

Esto solo afectaría a la autenticación de Windows al navegar desde la misma máquina en la que está alojado el sitio web en – Mick

0

Ha sido un tiempo desde que se hizo esta pregunta , pero sé que mucha gente ru n en esto mucho. Aquí se describe una solución más adecuada para esto: Kernel-mode authentication. Implementamos esto varios meses atrás, y funciona bien.

Otra buena explicación aquí: MORE 2008 AND KERBEROS: AUTHENTICATION DENIED, APP POOL ACCOUNT BEING INGNORED

Para aplicar a un solo sitio:

cd %windir%\system32\inetsrv 
set SiteName=TheSiteName 
appcmd.exe set config "%SiteName%" -section:system.webServer/security/authentication/windowsAuthentication /useKernelMode:"True" /useAppPoolCredentials:"True" /commit:apphost 

o para aplicar a todos los sitios:

%windir%\system32\inetsrv\appcmd.exe set config -section:windowsAuthentication /useAppPoolCredentials:"True" /commit:apphost 
+0

Bueno, esperaba una explicación de por qué la eliminación de Negociación lo arreglaba mágicamente pero no está aquí. Intenté quitar el modo kernel y poner de nuevo Negotiate y no lo solucionó. La eliminación de Negotiate lo solucionó ... ¿pero por qué? –

3

yo personalmente no recomienda desactivar el loopbackcheck a nivel mundial en su servidor (IE: Do NOT establece DisableLoopbackCheck en un valor de 1 en su registro). Esta es una vulnerabilidad de seguridad. Por favor solo deshabilite para hosts conocidos.

Aquí hay una función Powershell para que apunte en la dirección correcta.

function Add-LoopbackFix 
{ 
    param(
     [parameter(Mandatory=$true,position=0)] [string] $siteHostName 
    ) 

    $ErrorActionPreference = "Stop" 

    Write-Host "Adding loopback fix for $siteHostName" -NoNewLine 

    $str = Get-ItemProperty -Name "BackConnectionHostNames" -path 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0' -erroraction silentlycontinue 

    if ($str) { 
     if($($str.BackConnectionHostNames) -like "*$siteHostName*") 
     { 
      Write-Host "`tAlready in place" -f Cyan 
     } else{ 
      $str.BackConnectionHostNames += "`n$siteHostName" 
      Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0" -Name "BackConnectionHostNames" -Value $str.BackConnectionHostNames 
      Write-Host "`tDone" -f Green 
     } 
    } else { 
     New-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0" -Name "BackConnectionHostNames" -Value $siteHostName -PropertyType "MultiString" 
     Write-Host "`tDone" -f Green 
    } 

    Write-Host "`tnote: we are not disabling the loopback check all together, we are simply adding $siteHostName to an allowed list." -f DarkGray 
} 
> Add-LoopbackFix "ServerName" 

Source

+0

Deshabilitarlo en servidores de desarrollo interno no debería representar ningún riesgo. Si se trata de un servidor de producción, es probable que lo estés ejecutando de forma remota y, de todos modos, puedes dejar el bucle invertido solo. –

+0

@Ryios, incluso en Dev, la forma recomendada es hacerlo por dominio y no a nivel mundial. En producción, tenemos muchas aplicaciones (SOA) que llaman a otras aplicaciones en el mismo servidor. –

5

If it still does not work after moving NTML to top in the list of providers try to remove Negotiate completely so there is only NTML left.

Eso lo fijó para mí - mover NTML arriba no ayudó en Windows Server 2012 e IIS 8.5. Encontré la solución en el siguiente problema de stackoverflow: IIS 7.5 Windows Authentication Not Working in Chrome

+0

Esto funcionó para mí. – ben

Cuestiones relacionadas