登录发送POST请求的站点

时间:2013-12-31 08:10:31

标签: c# .net post webclient

此网站上有一个用于登录的网站:

    <form action="****" method="post">
<input name="token" type="hidden" value="QgS9Rs/nBnba" />
    <div class="userName">
                        <strong>User name</strong>:<br />
                        <input type="text" name="UserHandle" id="nameOrEmail" />
                    </div>
                    <div class="password">
                        <strong>Password</strong>:<br />
                        <input type="password" name="Password" />
                    </div>
                    <div>
                        <input id="login" type="submit" value="SignIn" name="Login" />
                    </div>
    </form>

当我在计算机上的.html文件中复制此部分页面,然后通过某个浏览器打开它,然后我输入用户名和密码,我可以正确登录到网站。 但我需要使用C#登录该站点,所以我实现了这段代码:

 WebClient wc = new WebClient();
            byte[] resp = wc.UploadValues("***", new System.Collections.Specialized.NameValueCollection
            {
                {"token",tokenVal},
                {"UserHandle","my username"},
                {"Password","my password"},
                {"Login","SignIn"}
            });
            string _response = Encoding.ASCII.GetString(resp);

tokenVal有有效数据,我信任它。 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

服务器无法区分浏览器发送的相同请求或其他内容 - 因此,只要您的C#生成的请求与浏览器创建的请求足够相似,服务器就会接受该请求。

主要差异通常来自:

  • cookies(浏览器自动管理cookie,自定义代码需要仔细从响应中获取cookie并在将来的请求中发送)
  • 页面上的动态字段(如AntiForgery令牌)
  • 自定义代码对请求的错误编码(特别是如果使用WebRequest等较低级别的对象发送请求)
  • 用户代理(不太可能,但可能)

如何比较请求:使用捕获流量的工具并将工作请求与不产生预期结果的工作请求进行比较。周围有许多Fiddler是我最喜欢的。

随着Fiddler浏览器请求将被自动捕获。对于C#(或其他自动代码),可能需要将代理设置为指向Fiddler(除非工具使用默认系统代理)。可以在此问题中找到相关说明 - How to use Fiddler to debug traffic from Any app (eg. C#/WPF app)

注意服务器没有返回任何错误代码 - 通常很明显,如果请求完全错误(400/500)或者您的身份验证信息错误(403/401)或者有某种多步骤进程进行身份验证(301 / 302)。

相关问题