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)
该类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
| 归档时间: |
|
| 查看次数: |
6666 次 |
| 最近记录: |