C# 为什么要使用;新网络凭据(用户名、密码)";无法对我的网站进行基本身份验证(从WinForms C应用程序)?

C# 为什么要使用;新网络凭据(用户名、密码)";无法对我的网站进行基本身份验证(从WinForms C应用程序)?,c#,.net,authentication,httpwebrequest,basic-authentication,C#,.net,Authentication,Httpwebrequest,Basic Authentication,我有一个使用基本身份验证(用户名/密码)的网站 为什么下面的代码不起作用?当我运行它时,web应用程序会将我带到登录控制器,而我希望它已经通过身份验证,因为我正在填充凭据。换句话说,我试图确认在.NET中如何确认我的winforms HttpWebRequest,以便它将自动执行身份验证过程。我假设NetworkCredential是应该执行此操作的.net类?或者在.NET中,您是否期望有一些手动的两步流程需要自己实现 代码如下: // Create a new webrequest

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

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

谢谢

WebRequest
除非受到网站的质疑,否则不会发送凭据。网站应首先用
WWW-Authenticate
标题回复401“需要授权”;
WebRequest
将使用凭据响应质询,服务应使用200 Http内容进行响应

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


请参见

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

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

设置StatusCode=401后,您是否尝试使用Fiddler/WireShark查看网络流量的实际情况?顺便说一句,如果使用了预身份验证,WebRequest将在第一个基本身份验证请求中发送凭据如果在后续调用中使用了CredentialsCache,则当预身份验证为true时,WebRequest将发送凭据。规范非常明确:“除第一个请求外,PreAuthenticate属性指示是否在不等待服务器质询的情况下随后续请求发送身份验证信息”。那么,你是说我应该使用预验证对网站进行初步访问,然后从下一个请求开始?有意义(我现在不在我的开发PC上)顺便说一句,我注意到web应用程序HTTP日志实际上显示了状态响应200,这两种情况都是(a)当我使用并通过web浏览器直接登录时,以及(b)当我发布此消息时,我使用.NET winforms客户端测试的情况。当通过我的浏览器使用该网站时,它可以正常工作(例如,如果没有登录到登录页面,则需要我登录)。第一次点击应该对您的请求是透明的。当您调用GetReponseStream()时,它会执行1)第一个HTTP GET(不带认证头),2)网站应该响应401,然后3)WebRequest使用认证头进行另一个GET,最后4)网站使用内容响应200,5)GetReponseStream()函数完成。通常的问题(您应该验证)是站点在第2步没有响应401)。