2011-11-09 40 views
8

運行下面的代碼:傳遞用戶名和密碼通過URI .NET的HttpWebRequest不起作用

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

...並檢查使用Wireshark的請求表明,沒有授權我的客戶端嘗試(網址爲一個簡單的服務將永遠返回401)。

此代碼的初始攻擊後發送一個授權報頭:

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(); 

使用System.Uri類沒有效果。爲什麼在URL中傳遞的用戶名和密碼不用於身份驗證?

(我是經過授權頭沒有初始的挑戰意識到this blog post,而不是眼前的問題)

編輯我要補充,這是很容易解決這個限制,例如與該位的代碼(添加URL未逃逸的味道),我只是好奇,爲什麼你要做到這一點:

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

回答

3

HttpWebRequest類不利用在Uri憑據(每dotPeek)。

FtpWebRequest的確,這裏是有關的代碼:

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); 
    } 

正如你所看到的只是它重視的憑據,所以你應該做的,而不是手動與解析Uri

+0

呀,我有一個類似的代碼 - 我只是不明白爲什麼HttpWebRequest忽略這個... – friism

+1

我認爲這是一個安全問題。許多瀏覽器現在也忽略了這一點:http://support.microsoft.com/kb/834489我不得不回頭看看以前的.NET版本,看它是否被編碼使用它,但它明確不是在4.0 –

相關問題