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

Gre*_*reg 4 .net c# authentication httpwebrequest basic-authentication

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

为什么以下代码不起作用?当我运行它时,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();
Run Code Online (Sandbox Code Playgroud)

谢谢

Rem*_*anu 15

WebRequest除非网站质疑,否则不会发送凭据.该网站应首先使用WWW-Authenticate标题回复401'需要授权' ; 该WebRequest会与凭据应对挑战,服务应与200 HTTP内容作出回应.

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

请参阅HttpWebRequest不传递凭据

  • 如果 PreAuthenticate 为 true 时在 **后续** 调用中使用 CredentialsCache,则 WebRequest 将发送凭据。规范非常清楚:“除了第一个请求,PreAuthenticate 属性指示是否在不等待服务器质询的情况下随后续请求发送身份验证信息”。http://msdn.microsoft.com/en-us/library/system.net.webrequest.preauthenticate.aspx (2认同)