通过URI将用户名和密码传递给.NET HttpWebRequest不起作用

fri*_*ism 8 .net uri http httpwebrequest

运行以下代码:

var request = HttpWebRequest.Create("http://username:password@savanttools.com/test-http-status-codes.asp?code=401");
var response = request.GetResponse();
Run Code Online (Sandbox Code Playgroud)

...并使用Wireshark检查请求显示我的客户端未尝试授权(url是一个总是返回401的简单服务).

此代码在初始质询后发送授权标头:

var request = HttpWebRequest.Create("http://username:password@savanttools.com/test-http-status-codes.asp?code=401");
request.Credentials = new NetworkCredential("username", "password");
var response = request.GetResponse();
Run Code Online (Sandbox Code Playgroud)

使用System.Uri该类没有任何效果.为什么在url中传递的用户名和密码不用于身份验证?

(我知道这篇关于在没有初始挑战的情况下传递授权标题的博文,但这不是手头的问题)

编辑我应该补充说,解决这个限制是相当容易的,例如使用这段代码(添加url un-escaping to taste),我只是好奇为什么你必须这样做:

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

Pau*_*yng 3

该类HttpWebRequest不使用 (per dotPeek) 中的凭据Uri

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);
  }
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它只是将其附加到凭据,因此您应该使用解析后的手动操作来执行此操作Uri