2012-10-02 7 views
20

Sto costruendo una semplice applicazione interna per la mia azienda e richiede l'autenticazione di Windows per la sicurezza. Tutte le altre modalità di autenticazione sono disabilitate. Sono bloccato in una situazione in cui Internet Explorer richiede le credenziali per 3 volte, quindi viene a mancare con questo errore:Autenticazione di Windows non riuscita in IIS 7.5

Not Authorized

HTTP Error 401. The requested resource requires user authentication.

Ho quindi creato un sito web scarno per testare questo fuori. Ho creato un nuovo sito in IIS, l'ho messo sulla sua porta (: 8111, scelto a caso), ho inserito un file statico "default.htm", ho disabilitato l'autenticazione anonima, quindi ho abilitato l'autenticazione di Windows. Tutto il resto è stato lasciato alle impostazioni predefinite. Il numero di porta è stato assegnato perché abbiamo più siti su questo computer che condividono tutti lo stesso IP.

Ecco alcuni scenari:

  • Navigazione dal server web stesso, a http: // localhost : 8111/funziona bene

  • Navigazione da un altro computer, a http : // ServerIpAddress: 8111/ funziona bene

  • Navigazione da anot il suo computer, a http: // ServerName : 8111/caduta rete (chiede le credenziali per 3 volte, poi dà errore 401)

ho cercato on-line e cercare di trovare una soluzione senza fortuna finora. O non l'ho trovato, o non capisco abbastanza bene quello che sto leggendo. Qualsiasi aiuto sarebbe molto apprezzato.

risposta

38

Ho appena risolto la soluzione con l'aiuto di un collega dopo 2 giorni di lotta con questo problema. Ecco cosa ha scritto:

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 Ciò ha funzionato per me, mentre una risposta più approfondita e corretta sarebbe stata quella di esaminare perché il Negoziare non funzionava, ma evidenzia rapidamente ciò che è sbagliato. – Seph

+0

ha perso mezza giornata a causa di questo. Grazie per la correzione. – learnerplates

+0

Questo ha risolto anche per me. Nel mio caso, ricevevo 504 errori di timeout del gateway. –

17

Errore 401.1 quando si esplora un sito Web che utilizza l'autenticazione integrata.

Soluzione

Disabilita il controllo di loopback

* 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

Grazie !!! Questo ha funzionato per me e sono sollevato dall'agonia dello sviluppatore e dalla frustrazione delle ultime ore. –

+0

Grazie per questo. Ho solo guardato e visto questa modifica del registro. Quando la precedente correzione NTLM non funziona, raccomando che questo sia il prossimo passo definitivo. Ho appena convalidato un sacco di ore di lavoro che ho speso cercando di capirlo! – JTester

+0

Ciò influirebbe solo sull'autenticazione di Windows durante la navigazione dalla stessa macchina in cui il sito Web è ospitato su – Mick

0

E 'stato un po' che questa domanda è stato chiesto , ma conosco molte persone ru n molto dentro. Una correzione più corretta per questo è descritta qui: Kernel-mode authentication. Lo abbiamo implementato diversi mesi fa e funziona perfettamente.

Un'altra buona spiegazione qui: MORE 2008 AND KERBEROS: AUTHENTICATION DENIED, APP POOL ACCOUNT BEING INGNORED

Per applicare a un singolo sito:

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 per applicare a tutti i siti:

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

Beh, speravo in una spiegazione del motivo per cui rimuovere Negotiate lo ha riparato magicamente ma non è qui. Ho provato a deselezionare la modalità kernel e ho inserito nuovamente la negoziazione e non è stata risolta. Rimuovere Negotiate ha risolto il problema ... ma perché? –

3

io personalmente non consiglio di disabilitare il loopbackcheck a livello globale sul server (IE: Do NON impostare DisableLoopbackCheck su un valore di 1 nel registro di sistema). Questa è una vulnerabilità di sicurezza. Si prega di disabilitare solo per gli host conosciuti.

Ecco una funzione PowerShell per farti puntare nella giusta direzione.

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

La disabilitazione su server di sviluppo interni non dovrebbe rappresentare un rischio. Se si tratta di un server di produzione, probabilmente lo si colpirà da remoto e comunque si potrà lasciare il loopback da solo. –

+0

@Rios, anche in Dev, il modo consigliato è farlo per dominio e non a livello globale. In produzione, abbiamo molte app (SOA) che chiamano altre app sullo stesso server. –

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.

quello fissato per me - lo spostamento NTML in alto non ha aiutato su Windows Server 2012 e IIS 8.5. Ho trovato la soluzione nel seguente problema StackOverflow: IIS 7.5 Windows Authentication Not Working in Chrome

+0

Questo ha funzionato per me. – ben