2011-11-09 39 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 –

相关问题