2012-10-22 8 views
6

sono in grado di risolvere un problema con un cliente in cui non possono eseguire l'autenticazione attraverso un proxy nel seguente modo:Come usare procura come browser o CredentialCache.DefaultCredentials diversi tra XP e 7

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

Questo funziona bene per Windows XP, tuttavia su Windows 7 ottengo un 407 (proxy non autenticato eccezione). Qualcuno sa qual è la differenza e, cosa più importante, cosa devo fare per farlo funzionare su entrambi i sistemi operativi?

UPDATE

Sto avendo gli utenti di controllare il seguente:

  1. Nel editor di Registro di sistema, si può andare a HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon e fammi sapere qual è il valore di CachedLogonsCount. f
  2. Nella casella di avvio, digitare Criteri di gruppo e un'opzione per Modifica criteri di gruppo dovrebbe apparire, fare clic su di esso. Quindi vai su Configurazione computer \ Modelli amministrativi \ Sistema \ Profili utente \ Elimina copie cache dei profili di roaming e fammi sapere se è configurato e, in caso affermativo, a cosa è impostato?

UPDATE per Bounty

Così, ho aggiunto la bontà. Posso prendere una soluzione da qui, o semplicemente un mezzo alternativo per ottenere attraverso un proxy su Windows 7 ...

Un altro aggiornamento

io non sono sicuro se questo è utile o no, ma siamo anche nel seguente modo:

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

la mia soluzione temporanea

Questo non è davvero una soluzione, ma funziona per ora. Sto usando app.config e settando il proxy come predefinito, con una ByPassList in modo che il proxy non sia nemmeno usato. Questo è possibile solo perché il proxy non ha un firewall forte al momento. Per altri clienti, ho bisogno di ottenere quanto sopra per lavorare

+3

Questo ha una sorta di odore di UAC ... –

+1

Sono d'accordo, ma non riesco a trovare alcuna documentazione seguendo queste linee. Sto cercando di trovare questa documentazione, e se non riesco a trovarlo, cercherò di decompilare il codice e capire cosa sta facendo esplicitamente. –

risposta

2

Questo pezzo di codice funziona per me su XP, Win7 e 2008

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

Questo non ha risolto il problema. È la stessa cosa che sto facendo ora, tranne che stai ricevendo il proxy in un modo diverso. 'UseDefaultCredentials = true' non fa nulla quando DefaultCredentials è già impostato, per http://msdn.microsoft.com/en-us/library/system.net.webproxy.usedefaultcredentials.aspx –

2

in realtà sembra che "fisso" in Win7 :) Can voi confermare che sia client che server specificano http 1.1

Ora discutiamo sul motivo per cui il browser funziona in questo scenario. IE utilizza WinINet sotto il cofano piuttosto che WinHTTP. Se guardiamo le tracce di rete vediamo che IE invia HTTP/1.1, ma il proxy risponde con con HTTP/1.0. IE accetta ancora questo comportamento, perché nello scenario Internet ci sono un numero infinito di client e server che ancora usano HTTP/1.0.

WinHTTP richiede rigorosamente la conformità HTTP/1.1 per mantenere attiva la connessione e HTTP Keep-Alives non sono supportati nel protocollo HTTP/1.0 . La funzione HTTP Keep-Alive è stata introdotta in HTTP/1.1 Protocollo come da RFC 2616. Il server o il proxy che si aspetta che il keep-alive debba anche implementare correttamente il protocollo. WinHTTP su Windows 7, Windows 2008 R2 sono rigidi in termini di sicurezza rispetto alla conformità del protocollo . La soluzione ideale è cambiare il server/proxy per utilizzare il protocollo corretto ed essere conforme a 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

Molto interessante! Dovrò controllare quando sarò al lavoro. Se è così, questo vale molto la taglia 250 :) –

+0

Scusa, non ho fortuna. Ecco l'output PCAP: 'CONNECT URL: 443 HTTP/1.1 \ r \ n' seguito da un 'HTTP/1.1 407 Non Autorizzato \ r \ n' HTTP 1.1 è specificato in richiesta e risposta –

+0

Mentre questo non funziona, io sono per aggiudicarti l'omonimia quando ti è venuta in mente l'unica risposta che non era quella che il mio era già "essenzialmente" –

0

Sarà questo lavoro?

Sto usando questo per impostare proxy, finora non abbiamo incontrato un errore su tutte le piattaforme Windows

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

Ho provato getproxy usando l'indirizzo, ma non i getcredentials. Darò a questo una prova e ti faccio sapere –

+0

ok bello .. fatemi sapere quando l'avete provato e incontrato alcuni errori –

+0

Siamo spiacenti, nessuna fortuna :( –

Problemi correlati