2009-06-23 10 views
12

Sto cercando di utilizzare System.Net.WebClient in un'applicazione WinForms per caricare un file su un server IIS6 che ha l'autenticazione di Windows come solo metodo 'Autenticazione'.System.Net.WebClient non funziona con l'autenticazione di Windows

WebClient myWebClient = new WebClient(); 
myWebClient.Credentials = new System.Net.NetworkCredential(@"boxname\peter", "mypassword"); 
byte[] responseArray = myWebClient.UploadFile("http://localhost/upload.aspx", fileName); 

ottengo un 'Il server remoto ha restituito un errore: (401) non autorizzato', in realtà si tratta di una 401.2

Sia client e IIS sono sulla stessa macchina Dev Windows Server 2003.

Quando si tenta di aprire la pagina in Firefox e immettere le stesse credenziali corrette come nel codice, viene visualizzata la pagina. Tuttavia, quando utilizzo IE8, ottengo lo stesso errore 401.2.

Ho provato Chrome e Opera ed entrambi funzionano.

I "Abilita autenticazione integrata di Windows" è abilitato nelle opzioni Internet di IE.

Security Event Log ha un Audit Failure:

Logon Failure: 
    Reason:  An error occurred during logon 
    User Name: peter 
    Domain:  boxname 
    Logon Type: 3 
    Logon Process: ÈùÄ 
    Authentication Package: NTLM 
    Workstation Name: boxname 
    Status code: 0xC000006D 
    Substatus code: 0x0 
    Caller User Name: - 
    Caller Domain: - 
    Caller Logon ID: - 
    Caller Process ID: - 
    Transited Services: - 
    Source Network Address: 127.0.0.1 
    Source Port: 1476 

Ho usato Process Monitor e Fiddler di indagare, ma senza alcun risultato.

Perché questo dovrebbe funzionare per i browser di terze parti ma non con IE o System.Net.WebClient?

+0

Dopo aver cambiato il metodo di autenticazione singola in IIS da Windows integrato per base funziona, ma che non risolve il problema perché non posso cambiare questa impostazione sul server di produzione. –

+0

Ho utilizzato lo strumento di diagnostica di autenticazione e controllo di accesso di IIS per monitorare il processo e ho confrontato il registro per Firefox con quello per IE. Sembra tutto a posto fino a quando la sfida/risposta NTLM fallisce, ma non mi dà nemmeno la minima idea del perché. –

+0

Ho fatto altri test: il server 2003 descritto sopra è in realtà una VM in Virtual PC, quando utilizzo IE dal computer host posso autenticarmi, ma non utilizzare IE sul guest. Tuttavia, utilizzando IE del guest funziona quando si utilizza l'indirizzo IP del sito piuttosto che il nome host impostato tramite il file hosts. Qualcosa rotto qui! Sono contento che non sia su un server di produzione. –

risposta

18

Ho riscontrato un problema simile, in cui la sicurezza Integrated/NTLM funzionerà solo se si accede all'host per nome computer o localhost. In realtà, è una funzionalità [male] del documento in Windows progettata per proteggere dagli "attacchi di riflessione".

Fondamentalmente, è necessario creare una chiave di registro sul computer che sta tentando di accedere al server e autorizzare il dominio che si sta tentando di colpire. Ogni nome host/nome di dominio completo deve essere sulla stessa riga: non ci sono caratteri jolly e il nome deve corrispondere esattamente. Dall'articolo KB:

  • Fare clic su Start, scegliere Esegui, digitare regedit, quindi fare clic su OK.
  • In Editor del Registro di sistema individuare e selezionare la seguente chiave di registro: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa \ MSV1_0
  • destro del mouse Msv1_0, scegliere Nuovo, quindi fare clic su multistringa Valore.
  • Digitare BackConnectionHostNames e quindi premere INVIO.
  • Fare clic con il tasto destro del mouse su BackConnectionHostNames, quindi fare clic su Modifica.
  • Nella casella Dati valore, digitare il nome host oi nomi host per i siti che si trovano sul computer locale, quindi fare clic su OK.
  • Uscire dall'editor del Registro di sistema e quindi riavviare il computer.

http://support.microsoft.com/kb/956158/en-us

+3

+10 Se potessi revocare questo 10 volte lo farei. Ho terminato i miei 3 giorni di grattacapo e googling. – DancesWithBamboo

+0

+20 Se avessi potuto, preferirei questo fino a 20 volte. –

4

Hai provato ...

new NetworkCredential("peter", "password", "boxname"); 

Si potrebbe anche provare ...

var credCache = new CredentialCache(); 
credCache.Add(new Uri ("http://localhost/upload.aspx"), 
       "Negotiate", 
       new NetworkCredential("peter", "password", "boxname")); 
wc.Credentials = credCache; 

Inoltre, secondo this Può darsi che IIS è stato configurato correttamente. Prova a sostituire "Negozia" con "Base" nella sezione sopra e controlla la configurazione di IIS per il sito web. C'è anche un sacco di possibili cause here.

+0

Ho appena provato, la stessa risposta 401.2 e 'Failure Audit' –

+0

Anche provato la versione 'Negoziare', stesso risultato. Ciò che mi dà fastidio è che non funziona anche in IE. –

0

Senza conoscere la distribuzione di IIS e presupponendo che si disponga delle regole di autorizzazione corrette per il set di caricamento in IIS (ad esempio il diritto consentire * ACL sulla destra, si sta tentando di caricare il contenuto, ecc.), Per prima cosa vorrei provare è impostare UseDefaultCredentials su true invece di impostare esplicitamente le credenziali. (Forse pensi di accedere al server con le credenziali che imposti ma non è così? Sarebbe possibile se funziona.)

Questo è uno scenario molto comune, quindi mi concentrerei sulle regole di autorizzazione IIS per la directory in cui si sta tentando di caricare il file, gli ACL effettivi su quella directory. Per es. il tuo sito sta impersonando o no? se lo è, allora devi avere ACL effettivi su quella dir, altrimenti qualunque account pool di account è in esecuzione.

+0

Non penso che sia un problema ACL perché non arriva così lontano, Process Monitor non mostra alcuna attività nella directory di destinazione. –

+0

Ho appena provato con UseDefaultCredentials, anche fallito. Ho bisogno di farlo funzionare con credenziali non predefinite perché gli utenti di Windows sono diversi sulle macchine client e server in produzione. –

1

Prova ad accedere alle opzioni di IE e aggiungi esplicitamente il sito alla zona Intranet. Quindi rieseguire il programma. Non si dovrebbe inoltre eseguire il programma da un accesso amministratore. Ciò potrebbe attivare lo Enhanced Security Configuration for Internet Explorer.

Potrebbe spiegare perché è possibile raggiungere il sito con Firefox e Opera, ma non con IE o WebClient.

+0

Buone idee, ho provato entrambi ma non funziona ancora. –

Problemi correlati