2009-06-03 19 views
5

Sto cercando di utilizzare HttpWebRequest per ottenere un URI https che richiede un nome utente e una password. Se metto l'URI in un browser, viene visualizzata una finestra di dialogo che richiede le credenziali e quindi funziona. Utilizzando HttpWebRequest mi dà un errore 401 non autorizzato.HttpWebRequest su SSL con credenziali client

La documentazione per NetworkCredentials dice che non supporta SSL, ma non riesco a trovare quello che dovrei usare.

risposta

5

Il server utilizza l'autenticazione di base HTTP o qualche altro tipo? Se si sta utilizzando HTTP basic, è possibile impostare la proprietà Credentials sulla richiesta Web su una credenziale contenente il nome utente e la password corretti e impostare la proprietà PreAuthenticate su true.

Ecco un esempio (è non testato, in modo da utilizzare solo come una linea guida):

var uri = new Uri("https://somesite.com/something"); 
var request = WebRequest.Create(uri) as HttpWebRequest; 
request.Credentials = new NetworkCredential("myUserName","myPassword"); 
request.PreAuthenticate = true; 

var response = request.GetResponse(); 

Nota: Nella mia esperienza questo modo, c'è qualche comportamento strano nel framework .NET. Si potrebbe pensare che dovrebbe fare quello che dice il codice, ma in realtà fa questo: richiesta

  • Invia al server senza credenziali
  • server risponde con 401
  • Re-Invia richiesta con le credenziali hai dato it
  • Il server accetta la richiesta.

Non ho idea del motivo per cui lo farebbe, poiché sembra rotto, quindi forse è stato un capriccio della mia macchina e forse non succederà a voi.

Se la tua app non è sensibile alle prestazioni e le tue richieste non sono POSTI di grandi quantità, probabilmente non te ne accorgi, ma per aggirarlo, ho dovuto creare manualmente l'intestazione di autenticazione di base HTTP e impostarla su il HttpWebRequest manualmente manipolando la raccolta Headers.

+0

Credo che il comportamento che descrivi sia lo stesso comportamento mostrato da wget in * nix. Si tenta una volta e fallisce e quindi invia le credenziali e ci riesce. – Stephan

+0

Penso che questa sia una specie di sequenza di richiesta di sfida che fa parte della specifica http. – MGOwen