为什么使用“新的NetworkCredential(用户名,密码)”不适用于我的网站的基本身份validation(来自WinForms C#应用程序)?

我有一个使用基本身份validation(用户名/密码)的网站。

为什么以下代码不起作用? 当我运行它时,Web应用程序将我带到登录控制器,而我期望它应该已经过身份validation,因为我正在填充凭据。 换句话说,我正在尝试确认如何在.NET中确认我的winforms HttpWebRequest,以便它将自动化身份validation过程。 我假设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(); 

谢谢

除非网站质疑,否则WebRequest不会发送凭据。 该站点应首先使用WWW-Authenticate标头响应401’Requireization Required’; WebRequest将使用凭据响应挑战,服务应响应200 Http内容。

听起来该网站没有正确实现Basic auth(规范说它应该首先挑战,传入领域)这是一种非常常见的行为。 您可以手动将基本身份validation添加到WebRequest.Headers集合,这是大多数开发人员最终要做的事情。

请参阅HttpWebRequest不传递凭据

如果有人正在寻找服务器端修复程序,那么只需添加即可

 HttpContext.Response.Headers.Add("WWW-Authenticate", "Basic realm=\"MyRealm\""); 

设置StatusCode = 401后