在C#中使用HttpWebRequest和表单身份验证

7

我是一名系统工程师,目前正在进行兼职的Web开发项目,所以对此还很陌生。我正试图为www.portapower.com编写一个HTTP客户端。

它将针对发布在网站上的某些特定物品进行筛选,如果它们符合特定要求,就会打印一条消息。

在尝试访问此页面时:

http://www.portapower.com/getbainfo.php?fclasscode=1&code=CB1831B.40H&fbrand=QUNFUg==

该网站会将我重定向到默认注册页面:

http://www.portapower.com/defaregit.php

以下是我的代码片段:

CookieContainer myContainer = new CookieContainer();

HttpWebRequest request = (HttpWebRequest)
WebRequest.Create("http://www.portapower.com/" + urlpart);
request.Credentials = new NetworkCredential("****", "******");
request.CookieContainer = myContainer;
request.PreAuthenticate = true;
request.Method = "POST";
HttpWebResponse response = (HttpWebResponse)
request.GetResponse();

Console.WriteLine(response.StatusCode);
Stream resStream = response.GetResponseStream();
Console.WriteLine(resStream.ToString());

我有用户名和密码,并且在浏览器中使用时可以正常工作。请告诉我这是否是访问经过身份验证的页面的正确方法。

4个回答

7
取决于网站如何验证用户。如果他们使用基本认证或Windows认证,则可以将Credentials属性设置为用户名/密码/域信息的HttpWebRequest,然后它应该可以工作。
但是,听起来你必须在网站上输入用户名/密码,这意味着你首先要登录到该网站。查看主页,这是我在处理登录的<form>元素中找到的内容:
<form name="formlogin" method="post" action="./defalogin.php" >
  <input name="emtext" type="text" id="emtext" size="12">
  <input name="pstext" type="password" id="pstext" size="12">
  <input type="submit" name="Submit" value="Logn in" 
    onClick="return logincheck()" >
</form>

我只包含了相关的部分。

因此,您首先要使用HttpWebRequest进入./defalogin.php页面,并POST emtextpstext值。同时,确保将CookieContainer属性设置为CookieContainer的实例。当该POST调用返回时,它很可能会填充一个cookie,您必须将其发送回网站。只需在任何后续的HttpWebRequest实例上设置CookieContainer属性,以便确保cookies传递。

然后您将进入链接指示的页面。

还要注意logincheck javascript函数,但是查看脚本源代码,它没有做任何值得注意的事情。


2
您传递的凭据是用于Windows身份验证的。您需要提交带有模拟表单提交的数据的POST数据,然后捕获响应中设置的会话cookie,并将该cookie用于未来的请求。
请查看此答案,其中包含执行此操作的代码: 使用HttpWebRequest登录页面

1

你不能这样做;你传递的凭据可以与基本身份验证方案一起使用(即,在浏览器中,你会看到一个弹出的用户名/密码对话框。)你必须模拟将数据输入该表单并捕获登录 cookie 并使用它。


0

NetworkCredential类主要用于控制常规的Windows凭据(NTLM、Kerberos等)。

那个网站是在Apache上运行的PHP网站,所以我不认为他们正在使用NTLM或Kerberos。

你想做的是将一些表单字段发布到该网站,然后保留你收到的cookie。确保在随后的请求中将cookie推回网站,以便它知道你已经登录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接