English 中文(简体)
使用C#的HttpWebRequest和表单身份验证
原标题:
  • 时间:2009-03-12 19:18:40
  •  标签:

我是一个系统专业人士,目前正在进行兼职网络开发项目,因此对此还比较新。我正在尝试为www.portapower.com编写一个HTTP客户端。

如果网站发布了某些特定物品,并且符合特定需求,它就会打印一条信息。

在尝试访问此页面时:

请点击以下链接访问:http://www.portapower.com/getbainfo.php?fclasscode=1&code=CB1831B.40H&fbrand=QUNFUg==

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

将此翻译成中文:http://www.portapower.com/defaregit.php 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());

我有用户名和密码,并且在使用浏览器时可以正常工作。请告诉我这样访问已认证页面是否正确。

最佳回答

这取决于网站如何验证用户。如果他们正在使用基本身份验证或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属性设置为该CookieContainer以确保cookie被传递。

然后您将转到链接中指示的页面。

令人担忧的是logincheck JavaScript函数,但查看脚本源代码,它没有任何值得注意的行为。

问题回答

您传递的凭据是用于Windows身份验证的。您需要提交带有类似于表单提交的数据的POST数据,然后捕获在响应中设置的会话cookie并将该cookie用于将来的请求。

看看这个答案,它有代码可以完成此操作:

使用HttpWebRequest登录页面

你不能用这种方式进行操作;你传递的凭据可以用于基本身份验证机制(即,在浏览器中,你会弹出一个用户名/密码对话框)。你需要模拟输入数据到那个表单中并获取登录Cookie并使用它。

NetworkCredential类实际上是用于控制常规的Windows凭据(NTLM,Kerberos等)。

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

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





相关问题
热门标签