我有一个使用基本身份验证(用户名/密码)的网站。
为什么以下代码不起作用?当我运行它时,Web应用程序将我带到登录控制器,而我期望它应该已经过身份验证,因为我正在填充凭据。换句话说,我试图确认如何在.NET中确认我的winforms HttpWebRequest,以便它将自动化身份验证过程。我假设NetworkCredential是应该这样做的.net类?或者在.NET中,您是否期望有一些手动两步过程需要自己实现?
以下是代码:
// Create a new webrequest to the mentioned URL.
var uri = new Uri("http://10.1.1.102:3000/download/sunset");
var myWebRequest = (HttpWebRequest)WebRequest.Create(uri);
myWebRequest.PreAuthenticate=true;
var networkCredential=new NetworkCredential("test", "asdfasdf");
myWebRequest.Credentials=networkCredential;
var myWebResponse = (HttpWebResponse)myWebRequest.GetResponse();
Console.Out.WriteLine("STATUS = " + myWebResponse.StatusCode);
var stream = myWebResponse.GetResponseStream();
var reader = new StreamReader(stream);
string text_read = reader.ReadToEnd();
Console.WriteLine(text_read);
DisplayHtml(text_read);
reader.Close();
stream.Close();
myWebResponse.Close();
由于
答案 0 :(得分:15)
WebRequest
不会发送凭据。该网站应首先使用WWW-Authenticate
标题回复401'需要授权'; WebRequest
将使用凭据响应挑战,服务应响应200 Http内容。
听起来网站没有正确实现Basic auth(规范说它应该首先挑战,传入领域)这是一种非常常见的行为。您可以手动将基本身份验证添加到WebRequest.Headers
集合,这是大多数开发人员最终要做的事情。
答案 1 :(得分:2)
如果有人正在寻找服务器端修复程序,那么只需添加
即可HttpContext.Response.Headers.Add("WWW-Authenticate", "Basic realm=\"MyRealm\"");
设置StatusCode = 401
后