2009-06-23 16 views
12

Próbuję użyć System.Net.WebClient w aplikacji WinForms do przesłania pliku na serwer IIS6, który ma uwierzytelnianie systemu Windows jako to tylko metoda "Uwierzytelniania".System.Net.WebClient nie działa z uwierzytelnianiem systemu Windows

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

dostaję 'Zdalny serwer zwrócił błąd: (401) nieuprawnione', faktycznie jest to 401,2

Zarówno klient, jak i IIS są na tej samej maszynie Windows Server 2003 Dev.

Kiedy próbuję otworzyć stronę w Firefoksie i wprowadzić te same poprawne dane logowania, co w kodzie, pojawia się strona. Jednak podczas korzystania z IE8, otrzymuję ten sam błąd 401.2.

Próbowałem Chrome i Opery i one działają.

Mam włączone "Włącz zintegrowane uwierzytelnianie systemu Windows" w opcjach Internetowych IE.

Security Event Log ma 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 

użyłem Process Monitor i Skrzypek do zbadania, ale bezskutecznie.

Dlaczego to działa w przypadku przeglądarek innych firm, ale nie w przypadku IE lub System.Net.WebClient?

+0

Po zmianie jednej metody uwierzytelniania w IIS z Zintegrowanego systemu Windows do Podstawowy to działa, ale to nie rozwiąże mój problem, ponieważ nie mogę zmienić to ustawienie na serwerze produkcyjnym. –

+0

Użyłem narzędzia IIS "Authentication and Access Control Diagnostics" do monitorowania procesu i porównywania logu dla Firefoksa z tym dla IE. Wygląda dobrze, dopóki wyzwanie/odpowiedź NTLM nie powiedzie się, ale nie daje mi też żadnej wskazówki, dlaczego tak się dzieje. –

+0

Zrobiłem więcej testów: Serwer 2003 opisany powyżej jest w rzeczywistości wirtualną maszyną wirtualną, podczas używania IE z hosta mogę uwierzytelnić, ale nie używam IE na gościu. Jednak korzystanie z gościa IE działa, gdy używany jest adres IP witryny, a nie nazwa hosta ustawiona za pośrednictwem pliku hosts. Coś tu złamanego! Cieszę się, że nie ma go na serwerze produkcyjnym. –

Odpowiedz

18

Widziałem podobny problem, w którym zabezpieczenia zintegrowane/NTLM działają tylko wtedy, gdy uzyskujesz dostęp do hosta za pomocą nazwy komputera lub hosta lokalnego. W rzeczywistości jest to [słaba] funkcja dokumentu w systemie Windows, zaprojektowana w celu ochrony przed "atakami odbicia".

Zasadniczo, musisz utworzyć klucz rejestru na komputerze, który próbuje uzyskać dostęp do serwera, i umieścić na białej liście domenę, którą próbujesz trafić. Każda nazwa hosta/FQDN musi znajdować się na własnej linii - nie ma symboli wieloznacznych, a nazwa musi dokładnie pasować. Z artykułu KB:

  • Kliknij przycisk Start, kliknij polecenie Uruchom, wpisz polecenie regedit, a następnie kliknij przycisk OK.
  • W Edytorze rejestru zlokalizuj i kliknij następujący klucz rejestru: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ LSA \ MSV1_0
  • prawym przyciskiem myszy MSV1_0, wskaż polecenie Nowy, a następnie kliknij wielociągu Wartość.
  • Wpisz BackConnectionHostNames, a następnie naciśnij klawisz ENTER.
  • Kliknij prawym przyciskiem myszy BackConnectionHostNames, a następnie kliknij przycisk Modyfikuj.
  • W polu Dane wartości wpisz nazwę hosta lub nazwy hostów witryn znajdujących się na komputerze lokalnym, a następnie kliknij przycisk OK.
  • Zamknij Edytor rejestru, a następnie uruchom ponownie komputer.

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

+3

+10 Gdybym mógł przegłosować to 10 razy, zrobiłbym to. Zakończyłem moje 3 dni drapania głowy i Googling. – DancesWithBamboo

+0

+20 Zrobiłbym to 20 razy, gdybym mógł. –

4

Czy próbowałeś ...

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

Można także spróbować ...

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

Ponadto, zgodnie z this może okazać się, że IIS jest skonfigurowany tak źle. Spróbuj wymienić "Negocjuj" na "Podstawowy" w powyższym i sprawdź konfigurację IIS dla witryny. Istnieje również wiele możliwych przyczyn: here.

+0

Właśnie wypróbowałem to, ta sama 401.2 odpowiedź i 'Niepowodzenie Audytu' –

+0

Próbowałem także 'Negocjować' wersja, ten sam wynik. To, co mnie miażdży, to także nie działa w IE. –

0

Bez znajomości wdrażania usług IIS i zakładając, że posiadasz prawidłowe reguły autoryzacji dla zestawu przesyłania w IIS (np. Prawo zezwól na * listy ACL na prawe katalogi, do których próbujesz przesłać zawartość, itp.), Najpierw powinienem spróbuj ustawić UseDefaultCredentials na true zamiast jawnie ustawić Credential. (Może uważasz, że uzyskujesz dostęp do serwera z ustawionymi poświadczeniami, ale tak nie jest?) To byłoby możliwe, jeśli to zadziała.)

Jest to bardzo popularny scenariusz, więc skupiłbym się na regułach autoryzacji IIS dla katalog, w którym próbujesz przesłać plik, rzeczywiste listy ACL do tego katalogu. Na przykład czy Twoja witryna podszywa się pod kogoś, czy nie? jeśli tak, to musisz mieć rzeczywiste listy ACL w tym katalogu, w przeciwnym razie niezależnie od tego, która pula aplikacji na koncie jest uruchomiona.

+0

Nie sądzę, że jest to problem z listą ACL, ponieważ nie dzieje się tak daleko, Monitor procesu nie pokazuje żadnej aktywności w katalogu docelowym. –

+0

Po prostu próbowałem go z UseDefaultCredentials, również się nie udało. Muszę zmusić go do pracy z nie-domyślnymi danymi uwierzytelniającymi, ponieważ użytkownicy systemu Windows różnią się na maszynach klienckich i serwerowych w produkcji. –

1

Spróbuj przejść do opcji przeglądarki IE i jawnie dodaj witrynę do strefy intranetowej. Następnie ponownie uruchom program. Nie należy również uruchamiać programu z poziomu logowania administratora. Może to wywołać Enhanced Security Configuration for Internet Explorer.

Może to wyjaśnić, dlaczego możesz trafić na stronę za pomocą przeglądarki Firefox i Opera, ale nie za pomocą IE ani WebClient.

+0

Dobre pomysły, próbowałem obu, ale nadal nie działa. –

Powiązane problemy