C# ASP.NET HTTP授权头
我想知道为什么我的asp.net应用程序在名为“Authorization”时不会将标题添加到我的文章中,但在我更改一个字符(如“Authorizations”)时,它可以正常工作。在其他网站的文档中,他们总是使用“授权”这个名称,所以我也想这样做,在这一点上,我只想理解为什么 我读过一些关于这方面的话题,但没有找到任何合乎逻辑的理由 下面是我的代码:C# ASP.NET HTTP授权头,c#,asp.net,httpwebrequest,C#,Asp.net,Httpwebrequest,我想知道为什么我的asp.net应用程序在名为“Authorization”时不会将标题添加到我的文章中,但在我更改一个字符(如“Authorizations”)时,它可以正常工作。在其他网站的文档中,他们总是使用“授权”这个名称,所以我也想这样做,在这一点上,我只想理解为什么 我读过一些关于这方面的话题,但没有找到任何合乎逻辑的理由 下面是我的代码: string fileName = "c:\\xyz.xml"; string uri = "http://myserver/Default.a
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添加监视的变量时,它工作正常。对于HTTP基本授权,应该使用Credentials属性
req.Credentials=新的网络凭证(“DDSServices”、“jCole2011”)代码>
这应该是你想要的。而不是设置授权标头 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标头(具有所需的身份验证类型)进行响应时,将使用请求中的凭据重新发送请求。我遇到了一个问题,即如何向标头添加身份验证/凭据。我用下面的方法找到了解决办法
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
还是有逻辑上的原因?我们合作的一家非常大的第三方公司也以同样的方式拥有其授权的文档,因此我想知道原因。按照威尔的建议,使用NetworkCredential方法要好得多。然而,你的方法也应该很有效,尽管我不明白你为什么要做两次(一次在调用GetRquestStream之前,一次在调用GetRequestStream之后。您应该在调用GetRequestStream之前执行一次。如果它仍然不起作用,请获取跟踪日志。说明位于,您可以告诉我为什么它更好吗?或者我可以从哪里了解为什么它更好?对我来说,网络凭据似乎与ad或表单身份验证相关联,我宁愿连接必须是匿名的,然后进行验证。但是,无论哪种方式,有人能告诉我原因吗?我几乎不关心此时的情况。NetworkCredential仅在收到401后发送身份验证头。这可能不是您想要的…使用旧的方式:var credentialBuffer=new UTF8Encoding().GetBytes(aUserName+”:“+aPassword);request.Headers[“Authorization”]=“Basic”+Convert.ToBase64String(credentialBuffer);
@WillHughes这不是真的。我试图使用PreAuthenticate=true,但它不起作用。您发布的链接验证您是否需要第一次捕获401。属性值类型:System.Boolean true,用于在进行身份验证后发送包含请求的HTTP授权标头;否则为false。默认值为false。"这是真的,但是发送回401未经授权,并且WWW Authenticate标头是HTTP规范的一部分。如果您想在第一个请求中强制发送标头,可以通过预验证方法执行此操作。此外,IIS会自动处理发送回此响应,其他编写良好的HTTP服务器(如Apache)也是如此。这很好浏览器知道如何显示密码提示对话框。那么您如何确定要使用的编码是ASCII?很好的一点。choosen编码看起来可能是bug的“难以找到”来源。我添加了链接,以供读者查找有关如何决定的更多信息。