2011-11-09 11 views
8

L'esecuzione del codice seguente:Passando nome utente e password per NET HttpWebRequest tramite URI non funziona

var request = HttpWebRequest.Create("http://username:[email protected]/test-http-status-codes.asp?code=401"); 
var response = request.GetResponse(); 

... e ispezionare la richiesta utilizzando Wireshark rivela che nessuna autorizzazione viene tentato dal mio cliente (l'url è un servizio semplice che restituirà sempre 401).

Questo codice invia un'intestazione di autorizzazione dopo la sfida iniziale:

var request = HttpWebRequest.Create("http://username:[email protected]/test-http-status-codes.asp?code=401"); 
request.Credentials = new NetworkCredential("username", "password"); 
var response = request.GetResponse(); 

Uso della classe System.Uri non ha alcun effetto. Perché il nome utente e la password sono passati nell'URL non utilizzati per l'autenticazione?

(io sappia this blog post sul passare l'intestazione di autorizzazione senza una sfida iniziale, ma che non è il problema a portata di mano)

EDIT Dovrei aggiungere che è abbastanza facile da aggirare questa limitazione , ad esempio con questo pezzo di codice (add url non-fuga a piacere), io sono solo curioso di sapere perché si deve fare questo:

var userInfo = request.Address.UserInfo; 
if (!string.IsNullOrEmpty(userInfo) && userInfo.Contains(':')) 
{ 
    request.Credentials = new NetworkCredential(userInfo.Split(':').First(), userInfo.Split(':').Last()); 
} 

risposta

3

la classe HttpWebRequest non utilizza le credenziali nel Uri (per dotPeek).

Ma la FtpWebRequest fa, ecco il codice rilevante:

if (this.m_Uri.UserInfo != null && this.m_Uri.UserInfo.Length != 0) 
    { 
    string userInfo = this.m_Uri.UserInfo; 
    string userName = userInfo; 
    string password = ""; 
    int length = userInfo.IndexOf(':'); 
    if (length != -1) 
    { 
     userName = Uri.UnescapeDataString(userInfo.Substring(0, length)); 
     int startIndex = length + 1; 
     password = Uri.UnescapeDataString(userInfo.Substring(startIndex, userInfo.Length - startIndex)); 
    } 
    networkCredential = new NetworkCredential(userName, password); 
    } 

Come si può vedere solo lo allega alle credenziali, così si dovrebbe fare solo che invece manualmente con un analizzata Uri

+0

Sì, Ho un po 'di codice simile - non capisco perché HttpWebRequest lo ignori ... – friism

+1

Penso che sia un problema di sicurezza. Molti browser ora ignorano anche questo: http://support.microsoft.com/kb/834489 Dovrei tornare a guardare le versioni .NET precedenti per vedere se è mai stato codificato per usarlo, ma non è esplicitamente in 4.0 –

Problemi correlati