4

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

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

谢谢

4

2 回答 2

16

WebRequest除非受到站点的质疑,否则不会发送凭据。该站点应首先以带有WWW-Authenticate标题的 401 'Authorization Required' 响应;将WebRequest使用凭据响应质询,并且服务应使用 200 Http 内容进行响应。

听起来该站点没有正确实施基本身份验证(规范说它应该首先挑战,以通过领域),这是一种非常常见的行为。您可以手动将基本身份验证添加到WebRequest.Headers集合中,这是大多数开发人员最终都会做的事情。

请参阅HttpWebRequest 未传递凭据

于 2009-12-01T23:17:51.820 回答
2

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

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

设置 StatusCode = 401 后

于 2017-05-18T14:50:06.977 回答