ASP.NET HTTP授权标头

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

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

这是我的代码如下:

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添加监视变量时,它工作正常。

我遇到了一个问题,如何将标识符/身份validation添加到标题。 我通过以下方式找到了解决方案。

 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

对于HTTP基本授权,您应该使用凭据属性。

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

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

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标头(需要具有身份validation类型)进行响应时,将使用请求中的凭据重新发送该请求。