Frage

Ich versuche System.Net.WebClient in einer WinForms-Anwendung zu verwenden, um eine Datei auf einem IIS6-Server hochladen, die die Windows-Authentifizierung hat als es nur 'Authentication' Methode.

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

Ich erhalte einen ‚Der Remoteserver hat einen Fehler zurückgegeben: (401) Unauthorized‘, eigentlich ist es ein 401,2

Sowohl Client und IIS auf dem gleichen Windows Server 2003 Dev-Maschine.

Wenn ich versuche, die Seite in Firefox zu öffnen und die gleichen richtigen Anmeldeinformationen wie in dem Code eingeben, kommt die Seite nach oben. Allerdings, wenn IE8, erhalte ich die gleichen 401.2 Fehler.

Versuchte Chrome und Opera und sie beide arbeiten.

Ich habe 'Enable Integriert Windows-Authentifizierung' in den IE Internet-Optionen aktiviert.

Das Sicherheitsereignisprotokoll hat eine Fehlerüberwachung:

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

Ich benutze Process Monitor und Fiddler zu untersuchen, aber ohne Erfolg.

Warum soll diese Arbeit für 3rd-Party-Browser aber nicht mit IE oder System.Net.WebClient?

War es hilfreich?

Lösung

Ich habe ein ähnliches Problem gesehen, wo die Integrated / NTLM-Sicherheit funktioniert nur, wenn Sie den Host durch die Computernamen oder localhost zugreifen. In der Tat ist es eine [schlecht] Dokument-Funktion in Windows, das gegen „Reflection Attacks“ ausgelegt ist, zu schützen.

Grundsätzlich müssen Sie einen Registrierungsschlüssel auf dem Computer erstellen, die auf den Server zuzugreifen versucht, und die weiße Liste der Domain, die Sie zu schlagen versuchen. Jeder Hostname / muss FQDN auf seine eigene Linie sein - es gibt keine Platzhalter und der Name muss genau übereinstimmen. Aus dem Datenbank-Artikel:

  • Klicken Sie auf Start und auf Ausführen, geben Sie regedit ein und klicken Sie auf OK.
  • Im Registrierungs-Editor, und dann die folgenden Registrierungsschlüssel klicken: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa \ MSV1_0
  • Rechtsklick MSV1_0 , zeigen Sie auf Neu, und klicken Sie dann auf Multi-String-Wert.
  • Typ Backconnectionhostnames , und drücken Sie die Eingabetaste.
  • Rechtsklick Backconnectionhostnames , und klicken Sie dann auf Ändern.
  • Sie in dem Feld Wert die Hostnamen oder den Host-Namen für die Sites, die auf dem lokalen Computer sind, und dann auf OK klicken.
  • Beenden Sie den Registrierungs-Editor, und starten Sie den Computer.

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

Andere Tipps

Haben Sie versucht ...

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

Sie können auch versuchen, ...

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

Auch nach diese es sein kann, dass IIS falsch konfiguriert ist. Versuchen Sie, „Verhandeln“ mit „Basic“ in der oben und die Überprüfung Ihrer IIS Config für die Website zu ersetzen. Es gibt auch eine Reihe von möglichen Ursachen hier .

Versuchen Sie, in IE Optionen gehen und explizit auf die Website der Intranetzone hinzuzufügen. Dann wieder starten Sie das Programm. Sie sollten auch das Programm von einer Administrator-Login nicht ausgeführt werden. Dies kann triggern die verstärkte Sicherheitskonfiguration für Internet Explorer .

Es könnte erklären, warum Sie die Website mit Firefox und Opera schlagen können, aber nicht mit IE oder WebClient.

Ohne Ihre IIS-Bereitstellung zu wissen, und unter der Annahme, dass Sie die richtigen Berechtigungsregeln für das Hochladen in IIS haben (zB das Recht erlauben * ACL auf den richtigen Verzeichnisse Sie versuchen, Inhalte zu laden, usw.), als erstes würde ich versuchen, ist UseDefaultCredentials auf true statt explizit festgelegt Credential einzustellen. (Vielleicht denken Sie, den Server mit den Anmeldeinformationen zugreifen, Sie setzen aber das ist nicht der Fall ist? Dass möglich wäre, wenn es funktioniert.)

Dies ist ein sehr häufiges Szenario, so würde ich für das Verzeichnis auf IIS Autorisierungsregeln konzentrieren, in dem Sie die Datei hochladen möchten, die tatsächliche ACL auf diesem Verzeichnis. Für ex. Ihre Website wird Identitätswechsel oder nicht? wenn ja, dann müssen Sie auf diesem Verzeichnis tatsächliche ACL haben, sonst was auch immer Konto AppPool laufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top