2011-08-31 12 views
5

L'app My C# colpisce un server Web che utilizza l'autenticazione NTLM.Come 'condividere' l'autenticazione NTLM su più HttpWebRequests?

Trovo che ogni richiesta effettuata al server (utilizzando una nuova HttpWebRequest) sia autenticata individualmente. In altre parole, ogni richiesta produce una risposta 401, dopo di che si verifica una conversazione di handshake NTLM prima di ottenere la risposta effettiva.

esempio:

Prima richiesta GET:

-> GET xyz 
<- 401 error (WWW-Authenticate:NTLM) 

-> GET xyz (Authorization:NTLM base64stuff) 
<- 401 error (WWW-Authenticate:NTLM base64stuff) 

-> GET xyz (Authorization: base64stuff) 
<- 200 

richieste successive:

-> GET xyz (Authorization:NTLM base64stuff) 
<- 401 error (WWW-Authenticate:NTLM) //can this request be avoided? 

-> GET xyz (Authorization: base64stuff) 
<- 200 

(inizialmente, con PreAuthenticate impostato su false, le richieste successive sembrava la prima richiesta - vale a dire tre richieste sottostanti per "richiesta")

C'è un modo di 'condividere' l'autenticazione eseguita sulla prima richiesta al server con successivi HttpWebRequests?

Ho pensato che forse la proprietà UnsafeAuthenticatedConnectionSharing mi avrebbe consentito di farlo, ma impostarla su true per tutti gli oggetti HttpWebRequest utilizzati nell'app non ha alcun effetto.

Tuttavia, se si imposta PreAuthenticate su true, una risposta 401 in meno si verifica per ogni richiesta successiva alla prima.

+0

Quale problema stai cercando di risolvere? –

+0

Voglio effettivamente "fare l'autenticazione" una volta e riutilizzarlo su HttpWebRequests. Piuttosto che autenticarsi ogni volta che colpisco il server. Tuttavia, potrei fraintendere NTLM e in effetti NTLM impone un sovraccarico di una richiesta aggiuntiva su ogni richiesta effettuata. – mackenir

+0

Sì, ma qual è il problema con il modo in cui funziona ora, quale problema risolverebbe per cambiare il comportamento che descrivi al comportamento che desideri, che cosa stai cercando di ottenere nel mondo reale. –

risposta

3

L'ultima richiesta inviata dopo l'esecuzione di NTLM (quella che risulta in una risposta 200) contiene un'intestazione di autorizzazione che indica al server di disporre delle credenziali corrette.

Non sono sicuro che la classe client abbia la caratteristica di tenerlo da solo, ma se si trova un modo per conservare questa intestazione e aggiungerla alle richieste successive, dovrebbe funzionare correttamente.


Aggiornamento: NTLM autentica una connessione, quindi è necessario mantenere la connessione aperta utilizzando l'intestazione Keep-Alive. La classe client dovrebbe fornire alcune impostazioni per questo. Per ulteriori informazioni, vedere questa pagina, che trovo molto utile e chiaro schema NTLM:

http://www.innovation.ch/personal/ronald/ntlm.html

+0

Hmmm. È possibile impostare l'intestazione Authorization su HttpWebRequest e l'ho provato. Tuttavia non ha funzionato - il server restituisce una 400 Bad Request, indicando che l'intestazione dell'autorizzazione non può essere "riprodotta" in questo modo. Quale suppongo abbia un senso per ragioni di sicurezza. – mackenir

+0

Vedere le mie modifiche sopra – Iravanchi

+0

Dopo aver fatto un pochino di test, sembra, anche se HttpWebRequest ha una proprietà KeepAlive, che non migliora le cose oltre l'impostazione PreAuthenticate = true. Un po 'fastidioso. – mackenir