2012-10-22 10 views
6

jestem w stanie rozwiązać problem z klientem, w którym nie może uwierzytelnić przez pełnomocnika w następujący sposób:Jak używać proxy jak przeglądarki lub CredentialCache.DefaultCredentials różnych między XP i 7

var proxy = WebRequest.GetSystemWebProxy(); 
    proxy.Credentials = CredentialCache.DefaultNetworkCredentials; 
    service.Proxy = proxy; 

Działa to dobrze dla Windows XP, jednak w Windows 7 otrzymuję 407 (wyjątek proxy nie jest uwierzytelniony). Czy ktokolwiek wie, jaka jest różnica, i co ważniejsze, co muszę zrobić, aby to działało w obu systemach operacyjnych?

UPDATE

jestem użytkownikom sprawdzić następujące mający:

  1. W edytorze rejestru, można przejść do HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon i niech mnie wiedzieć, jaka jest wartość dla CachedLogonsCount. f
  2. W polu Rozpocznij wpisz Zasady grupy i wybierz opcję Edytuj Zasady grupowe, które się pojawią, kliknij na nią. Następnie przejdź do Konfiguracja komputera \ Szablony administracyjne \ System \ Profile użytkownika \ Usuń buforowane kopie profili mobilnych i daj mi znać, jeśli jest skonfigurowany, a jeśli tak, to, co jest ustawione?

Aktualizacja dla BOUNTY

Więc dodałem nagrodę. Mogę przyjąć rozwiązanie stąd, albo po prostu alternatywny sposób na uzyskanie przez pełnomocnika na Windows 7 ...

Kolejna aktualizacja

Nie jestem pewien, czy jest to przydatne lub nie, ale jesteśmy również w następujący sposób:

service.PreAuthenticate = true; 
service.Url = "myurl"; 
service.Credentials = new NetworkCredential(txt_UserName.Text, txt_Password.Text); 

Moje rozwiązanie tymczasowe

nie jest to rozwiązanie, ale działa teraz. Używam app.config i ustawiając proxy jako domyślną, z ByPassList, aby proxy nie było nawet używane. Jest to możliwe, ponieważ serwer proxy nie ma obecnie silnej zapory ogniowej. Dla pozostałych klientów, muszę dostać się wyżej pracować

+3

To ma jakiś zapach ZAC ... –

+1

Zgadzam się, ale nie mogę znaleźć żadnej dokumentacji wzdłuż tych linii. Próbuję znaleźć taką dokumentację, a jeśli nie mogę tego znaleźć, postaram się zdekompilować kod i dowiedzieć się, co robi jawnie. –

Odpowiedz

2

Ten fragment kodu działa dla mnie na XP, Win7 i 2008

var webProxy = new WebProxy(WebRequest.DefaultWebProxy.GetProxy(new Uri({TheURLoftheService}))); 
webProxy.Credentials = CredentialCache.DefaultCredentials; 
webProxy.UseDefaultCredentials = true; 
service.Proxy = webProxy; 
+2

To nie rozwiązało problemu. To jest to samo, co teraz robię, z wyjątkiem tego, że dostajesz proxy w inny sposób. 'UseDefaultCredentials = true' nie robi nic, gdy DefaultCredentials jest już ustawiony, za http://msdn.microsoft.com/en-us/library/system.net.webproxy.usedefaultcredentials.aspx –

2

faktycznie wygląda ich „stałe” go w Win7 :) Ty możesz potwierdź, że zarówno klient, jak i serwer określają http 1.1

Teraz omówimy, dlaczego przeglądarka działa w tym scenariuszu. IE używa WinINet pod maską zamiast WinHTTP. Jeśli spojrzymy na ślady sieci widzimy, że IE wysyła HTTP/1.1, ale proxy odpowiada z HTTP/1.0. IE nadal akceptuje to zachowanie, ponieważ w scenariuszu internetowym jest niezliczona liczba klientów i serwerów, które wciąż używają HTTP/1.0.

WinHTTP ściśle wymaga zgodności z protokołem HTTP/1.1 w celu utrzymania połączenia przy życiu, a utrzymywanie aktywności HTTP nie jest obsługiwane w protokole HTTP/1.0 . Funkcja HTTP Keep-Alive została wprowadzona w HTTP/1.1 protokół zgodnie z RFC 2616. Serwer lub serwer proxy, który oczekuje, że użytkownik będzie nadal żył, powinien również poprawnie implementować protokół. WinHTTP na Windows 7, Windows 2008 R2 są rygorystyczne pod względem bezpieczeństwa wrto zgodności protokołu. Idealnym rozwiązaniem jest zmiana serwera/proxy w celu użycia właściwego protokołu i zgodności z RFC.

http://blogs.msdn.com/b/httpcontext/archive/2012/02/21/changes-in-winhttp-on-windows-7-and-onwards-wrto-http-1-0.aspx

+2

Bardzo interesujące! Będę musiał sprawdzić, kiedy dostanę się do pracy. Jeśli tak, to jest warte 250 nagród :) –

+0

Niestety, nie ma szczęścia. Oto dane wyjściowe PCAP: 'CONNECT URL: 443 HTTP/1.1 \ r \ n', po którym następuje HTTP/1.1 407 Nieautoryzowane \ r \ n' HTTP 1.1 jest określone w żądaniu i odpowiedzi –

+0

Chociaż to nie działa, jestem zamierzam przyznać nagrodę dla ciebie, gdy wymyśliłeś jedyną odpowiedź, która nie była tym, co moje było "zasadniczo" –

0

Czy to zadziała?

używam tego, aby ustawić proxy, do tej pory nie mieliśmy błąd na wszystkich oknach platformie

Uri address = new Uri("http://your-webservice-address"); 

//Get User current network credential 
ICredentials credentials = CredentialCache.DefaultCredentials; 
NetworkCredential credential = credentials.GetCredential(address, "Basic"); 

//Get HttpWebRequest 
HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest; 

//Network Credential should be included on the request to avoid network issues when requesting to the web servic 
request.Proxy = WebRequest.DefaultWebProxy; 
request.Credentials = new NetworkCredential(credential.UserName, credential.Password, credential.Domain); 
+0

Próbowałem getproxy używając adresu, ale nie getcredentials. Spróbuję i dam znać –

+0

ok fajnie .. daj mi znać, kiedy spróbowałeś i napotkasz jakieś błędy –

+0

Niestety, nie ma szczęścia :( –