2013-06-10 9 views
7

Sto costruendo un servizio web con Asp.net web api, e devo prendere un'immagine da una telecamera AXIS IP. La fotocamera, tuttavia, utilizza l'autenticazione del digest. Quindi il mio codice C# simile a questa:.NET WebClient invia la richiesta senza autenticazione prima

  WebClient webClient = new WebClient(); 
      webClient.UseDefaultCredentials = true; 
      webClient.Credentials = new NetworkCredential("***", "***"); 
      byte[] imageStream = webClient.DownloadData("http://192.168.0.90/axis-cgi/jpg/image.cgi"); 

Questa tutte le opere, ma quando si guarda Fiddler, ho scoperto che il client invia una richiesta senza autenticazione, e un 401 errore si ripresenta. Dopodiché invia quello con sicurezza digest.

ho trovato una soluzione con le credenziali manuali iniezione qui:

http://kristofmattei.be/2013/02/20/webclient-not-sending-credentials-heres-why/

Ma questo sembra sbagliato. Utilizza l'autenticazione di base, che non voglio davvero e sembra un po 'poco professionale.

C'è un modo per inviare la richiesta firmata immediatamente o è questo il modo che funziona perché sto notando che la fotocamera sta tornando il nonce nella prima richiesta?

+0

Hai provato [Autenticazione HTTPS e Digest] (http://stackoverflow.com/a/1970990/580951) – Romoku

+0

Beh, sì, il collegamento è simile, penso che tu stia dicendo di utilizzare le credenziali predefinite e quindi di impostare le credenziali esplicite , prova a impostarlo prima su false e poi vedi se funziona – Bearcat9425

+0

Nessun cambiamento, dopo entrambi i consigli. –

risposta

7

Non si può evitare la prima richiesta anonima perché il WebClient deve capire quale schema di autenticazione utilizzato, in base alla risposta 401 sta ottenendo, potrebbe essere di base, digerire, ecc ... Vedere that question.

Con digest non è possibile evitare comunque 2 richieste perché la prima risposta 401 contiene un nonce (un valore necessario per la richiesta di autenticazione del client), vedere Digest access authentication, Wikipedia.

Se fosse l'autenticazione di base avrebbe potuto evitare la prima richiesta impostando manualmente l'intestazione necessario con le proprie credenziali.

+0

Questo è stato molto utile. Infatti, per l'autenticazione di base WebClient non invia le credenziali alla prima richiesta, attende un 401 prima di farlo. Pertanto, se il tuo server non è conforme (ad esempio restituisce 407 anziché 401 come nel caso di alcune API mailgun), non invierà mai credenziali. Boo! Il modo per risolvere questo problema è impostare manualmente l'intestazione Authorization, come suggerito: http://stackoverflow.com/a/9699211/118878 Grazie! – DenNukem