ASP.NET HTTP授权标头

时间:2011-01-12 23:19:57

标签: c# asp.net httpwebrequest

我想知道为什么我的asp.net应用程序在命名为'Authorization'时不会将标题添加到我的帖子中,但是当我更改一个字符时,它会正常工作,比如“Authorizations”。在其他网站的文档中,他们总是使用“授权”这个名称,所以我也想,在这一点上,我只想说明原因。

我已经阅读了一些关于此的主题,但没有找到任何合理的原因。

以下是我的代码:

string fileName = "c:\\xyz.xml";
string uri = "http://myserver/Default.aspx";
req = WebRequest.Create(uri);
req.Method = "POST";
req.ContentType = "text/xml";
byte[] authBytes = Encoding.UTF8.GetBytes("DDSServices:jCole2011".ToCharArray());
req.Headers.Add("Authorization", "BASIC " + Convert.ToBase64String(authBytes) );
req.Headers.Add("test", "test");
UTF8Encoding encoder = new UTF8Encoding();
byte[] data = encoder.GetBytes(this.GetTextFromXMLFile(fileName));
req.ContentLength = data.Length;
Stream reqStream = req.GetRequestStream();
reqStream.Write(data, 0, data.Length);
reqStream.Close();
req.Headers.Add("Authorization", "BASIC" + Convert.ToBase64String(authBytes));
System.Net.WebResponse response = req.GetResponse();
System.IO.StreamReader reader = new StreamReader(response.GetResponseStream());
string str = reader.ReadToEnd();

另一个令人烦恼的是,当我通过fiddler添加监视变量时,它工作正常。

3 个答案:

答案 0 :(得分:41)

我遇到了如何向标头添加身份验证/凭据的问题。我通过以下方式找到了解决方案。

string _auth = string.Format("{0}:{1}", "myUser","myPwd");
string _enc = Convert.ToBase64String(Encoding.ASCII.GetBytes(_auth));
string _cred = string.Format("{0} {1}", "Basic", _enc);
req.Headers[HttpRequestHeader.Authorization] = _cred;

这给了我想要的那些标题(粘贴Wireshark描述),

  

授权:基本bXlVc2VyOm15UHdk \ r \ n
  凭据:myUser:myPwd

答案 1 :(得分:11)

对于HTTP Basic Authorization,您应该使用Credentials属性。

req.Credentials = new NetworkCredential("DDSServices", "jCole2011");

这应该做你想要的。而不是设置Authorization标头。

答案 2 :(得分:3)

NetworkCredential是一个很好的解决方案,但您呼叫的网站必须在响应中处理未经授权的401和WWW-Authenticate标头。

客户端:

request.Credentials = new CredentialCache {{aUri, "Basic", new NetworkCredential(aUserName, aPassword)}};

服务器:

Response.ClearContent();
Response.StatusCode = 401;
Response.AddHeader("WWW-Authenticate", "Basic");
Response.End();

这将导致服务器的2次点击。初始调用将在没有凭据的情况下转到服务器。当服务器使用401和WWW-Authenticate标头(需要验证类型)进行响应时,请求将重新发送请求中的凭据。