Domanda

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

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

Viene visualizzato il messaggio "Il server remoto ha restituito un errore: (401) Non autorizzato", in realtà è un 401.2

Sia il client che IIS si trovano sulla stessa macchina Dev di Windows Server 2003.

Quando provo ad aprire la pagina in Firefox e inserisco le stesse credenziali corrette del codice, viene visualizzata la pagina. Tuttavia, quando utilizzo IE8, ottengo lo stesso errore 401.2.

Ho provato Chrome e Opera ed entrambi funzionano.

Ho abilitato 'Abilita autenticazione integrata di Windows' nelle opzioni Internet IE.

Il registro degli eventi di sicurezza ha un controllo degli errori:

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 per investigare ma senza risultati.

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

È stato utile?

Soluzione

Ho riscontrato un problema simile, in cui la sicurezza integrata / NTLM funzionerà solo se si accede all'host in base al nome del computer o all'host locale. In effetti, è una funzionalità [scarsamente] 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 / FQDN deve essere sulla propria 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.
  • Nell'editor del Registro di sistema, individuare e fare clic sulla seguente chiave di registro: \ SYSTEM HKEY_LOCAL_MACHINE \ CurrentControlSet \ Control \ Lsa \ MSV1_0
  • Fai clic con il pulsante destro del mouse su MSV1_0 , scegli Nuovo, quindi fai clic su Valore multistringa.
  • Digita BackConnectionHostNames , quindi premi INVIO.
  • Fai clic con il pulsante destro del mouse su BackConnectionHostNames , quindi fai clic su Modifica.
  • Nella casella Dati valore, digitare il nome host o i nomi host per i siti che si trovano sul computer locale, quindi fare clic su OK.
  • Esci dall'editor del Registro di sistema e quindi riavvia il computer.

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

Altri suggerimenti

Hai provato ...

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

Potresti 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 questo potrebbe essere che IIS sia configurato in modo errato. Prova a sostituire " Negoziare " con " Base " sopra e verifica la configurazione di IIS per il sito Web. Esistono anche molte cause possibili qui .

Prova ad accedere alle opzioni di IE e aggiungi esplicitamente il sito alla zona Intranet. Quindi rieseguire il programma. Inoltre, non è necessario eseguire il programma da un accesso amministratore. Ciò può attivare la Enhanced Security Configuration for Internet Explorer .

Potrebbe spiegare perché puoi visitare il sito con Firefox e Opera, ma non con IE o WebClient.

Senza conoscere la tua distribuzione IIS e supponendo che tu abbia le regole di autorizzazione corrette per il caricamento impostate in IIS (ad es. il diritto consenti * ACL è sulla directory giusta su cui stai tentando di caricare il contenuto, ecc.), prima cosa che proverei è impostare UseDefaultCredentials su true anziché impostare esplicitamente Credential. (Forse pensi di accedere al server con le credenziali che stai impostando, ma non è così? Sarebbe possibile se funzionasse.)

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 è impersonale o no? in tal caso, devi avere ACL effettivi su quella directory, altrimenti qualunque pool di app dell'account è in esecuzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top