使用 HttpWebRequest 进行基本身份验证
Basic authentication with HttpWebRequest
我正在制作一个类似邮递员的应用程序,我正在尝试使用 HttpWebRequest
实现基本身份验证,但我总是以 403 forbidden error
结尾,我想这意味着我做错了什么.
我目前正在使用 WebHeaderCollection
来存储我的 header。
我这样构建我的授权 header :
代码:
private WebHeaderCollection AddAuthorization(WebHeaderCollection wc)
{
if (expanderBasique.IsExpanded && !String.IsNullOrEmpty(BasiqueUserName.Text) && !String.IsNullOrEmpty(BasiquePassword.Password))
{
String username = BasiqueUserName.Text.Trim();
String password = BasiquePassword.Password.Trim();
String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(username + ":" + password));
wc.Add("Authorization", "Basic " + encoded);
}
return wc;
}
然后我 link 我的 collection 到 HttpWebRequest :
代码:
private async Task<WebResponse> ExecuteHttpWebRequest()
{
var selectedMethode = Methode.SelectedItem as TextBlock;
string method = selectedMethode.Text;
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(Query.Text);
WebHeaderCollection myWebHeaderCollection = webRequest.Headers;
myWebHeaderCollection = BuildHeaderCollection(myWebHeaderCollection);
myWebHeaderCollection = AddAuthorization(myWebHeaderCollection);
webRequest.PreAuthenticate = true;
webRequest.Method = method;
if (webRequest.Method == "POST" || webRequest.Method == "PUT" || webRequest.Method == "PATCH")
{
byte[] data = Encoding.ASCII.GetBytes(Body.Text);
webRequest.ContentLength = data.Length;
using (var stream = webRequest.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
}
return await webRequest.GetResponseAsync();
}
我用 GitHub api 和我自己的凭据尝试这段代码:
https://api.github.com/user
使用 postman 或 restER 等其他应用程序时,我得到了想要的结果,但我自己的结果总是出现 403 错误。
我真的很想坚持使用 HttpWebRequest。
我尝试了 Stack Overflow 的各种解决方案,但均未成功:
Here
或 here
编辑:
根据 FaizanRabbani 的评论,我通过将 UserAgent 属性 设置为 httpwebrequest 解决了这个问题:
代码:
private async Task<WebResponse> ExecuteHttpWebRequest()
{
var selectedMethode = Methode.SelectedItem as TextBlock;
string method = selectedMethode.Text;
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(Query.Text);
WebHeaderCollection myWebHeaderCollection = webRequest.Headers;
myWebHeaderCollection = BuildHeaderCollection(myWebHeaderCollection);
myWebHeaderCollection = AddAuthorization(myWebHeaderCollection);
webRequest.PreAuthenticate = true;
webRequest.Method = method;
webRequest.UserAgent = "something";
if (webRequest.Method == "POST" || webRequest.Method == "PUT" || webRequest.Method == "PATCH")
{
byte[] data = Encoding.ASCII.GetBytes(Body.Text);
webRequest.ContentLength = data.Length;
using (var stream = webRequest.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
}
return await webRequest.GetResponseAsync();
}
我正在制作一个类似邮递员的应用程序,我正在尝试使用 HttpWebRequest
实现基本身份验证,但我总是以 403 forbidden error
结尾,我想这意味着我做错了什么.
我目前正在使用 WebHeaderCollection
来存储我的 header。
我这样构建我的授权 header :
代码:
private WebHeaderCollection AddAuthorization(WebHeaderCollection wc)
{
if (expanderBasique.IsExpanded && !String.IsNullOrEmpty(BasiqueUserName.Text) && !String.IsNullOrEmpty(BasiquePassword.Password))
{
String username = BasiqueUserName.Text.Trim();
String password = BasiquePassword.Password.Trim();
String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(username + ":" + password));
wc.Add("Authorization", "Basic " + encoded);
}
return wc;
}
然后我 link 我的 collection 到 HttpWebRequest :
代码:
private async Task<WebResponse> ExecuteHttpWebRequest()
{
var selectedMethode = Methode.SelectedItem as TextBlock;
string method = selectedMethode.Text;
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(Query.Text);
WebHeaderCollection myWebHeaderCollection = webRequest.Headers;
myWebHeaderCollection = BuildHeaderCollection(myWebHeaderCollection);
myWebHeaderCollection = AddAuthorization(myWebHeaderCollection);
webRequest.PreAuthenticate = true;
webRequest.Method = method;
if (webRequest.Method == "POST" || webRequest.Method == "PUT" || webRequest.Method == "PATCH")
{
byte[] data = Encoding.ASCII.GetBytes(Body.Text);
webRequest.ContentLength = data.Length;
using (var stream = webRequest.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
}
return await webRequest.GetResponseAsync();
}
我用 GitHub api 和我自己的凭据尝试这段代码: https://api.github.com/user
使用 postman 或 restER 等其他应用程序时,我得到了想要的结果,但我自己的结果总是出现 403 错误。
我真的很想坚持使用 HttpWebRequest。
我尝试了 Stack Overflow 的各种解决方案,但均未成功:
Here
或 here
编辑:
根据 FaizanRabbani 的评论,我通过将 UserAgent 属性 设置为 httpwebrequest 解决了这个问题:
代码:
private async Task<WebResponse> ExecuteHttpWebRequest()
{
var selectedMethode = Methode.SelectedItem as TextBlock;
string method = selectedMethode.Text;
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(Query.Text);
WebHeaderCollection myWebHeaderCollection = webRequest.Headers;
myWebHeaderCollection = BuildHeaderCollection(myWebHeaderCollection);
myWebHeaderCollection = AddAuthorization(myWebHeaderCollection);
webRequest.PreAuthenticate = true;
webRequest.Method = method;
webRequest.UserAgent = "something";
if (webRequest.Method == "POST" || webRequest.Method == "PUT" || webRequest.Method == "PATCH")
{
byte[] data = Encoding.ASCII.GetBytes(Body.Text);
webRequest.ContentLength = data.Length;
using (var stream = webRequest.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
}
return await webRequest.GetResponseAsync();
}