如何从受密码保护的https网站查询数据

时间:2010-04-14 21:30:41

标签: c# .net asp.net https

我希望我的应用程序从安全网站查询csv文件。我没有网络编程的经验,所以我很欣赏详细的说明。目前我有用户登录该站点,手动查询csv,并让我的应用程序在本地加载该文件。我想通过让用户输入他的登录信息,在网站上验证他,以及查询数据来实现自动化。该应用程序是用C#.NET编写的。

我已经测试了以下代码,并且一旦用户已经对自己进行身份验证并创建了手动查询,就能够访问该文件。

        System.Net.WebClient Client = new WebClient();
        Stream strm = Client.OpenRead("https://<URL>/file.csv");

以下是发送到站点进行身份验证的请求。我把角度包括在真正的用户名和密码中。

POST /pwdVal.asp HTTP/1.1
Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; Tablet PC 2.0; OfficeLiveConnector.1.4; OfficeLivePatch.1.3; .NET4.0C; .NET4.0E)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Cookie: ASPSESSIONID<unsure if this data contained password info so removed>; ClientId=<username>
Host: www3.emidas.com
Content-Length: 36
Connection: Keep-Alive
Cache-Control: no-cache
Accept-Language: en-US

client_id=<username>&password=<password>

3 个答案:

答案 0 :(得分:1)

一旦登录,服务器很可能会发送cookie。您需要提交与登录表单相同的值。 (这可以使用UploadValues()完成)但是,您需要将生成的Cookie保存在CookieContainer中。

当我这样做时,我是使用HttpWebRequest完成的,但是根据http://couldbedone.blogspot.com/2007/08/webclient-handling-cookies.html,您可以继承WebClient并覆盖GetWebRequest()方法以使其支持cookie。

哦,此外,我发现在手动访问网站时使用Fiddler以查看实际来回发送到网站的内容是有用的,所以我知道我想要重现的内容。

编辑,详细请求:我只能详细说明如何使用HttpWebRequest来完成它,我还没有使用WebClient来完成它。以下是我用于登录的代码段。

    private CookieContainer _jar = new CookieContainer();
    private string _password;
    private string _userid;
    private string _url;
    private string _userAgent;

...

        string responseData;

        HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(_url);

        webRequest.CookieContainer = _jar;
        webRequest.Method = "POST";
        webRequest.ContentType = "application/x-www-form-urlencoded";
        webRequest.UserAgent = _userAgent;

        string requestBody = String.Format(
            "client_id={0}&password={1}", _userid, _password);

        try
        {
            using (StreamWriter requestWriter = new StreamWriter(webRequest.GetRequestStream()))
            {

                requestWriter.Write(requestBody);
                requestWriter.Close();

                using (HttpWebResponse res = (HttpWebResponse)webRequest.GetResponse())
                {
                    using (StreamReader responseReader = new StreamReader(res.GetResponseStream()))
                    {

                        responseData = responseReader.ReadToEnd();
                        responseReader.Close();

                        if (res.StatusCode != HttpStatusCode.OK)
                            throw new WebException("Logon failed", null, WebExceptionStatus.Success, res);
                    }

                }
            }

答案 1 :(得分:0)

在您离开这个兔子洞之前,请联系该网站并询问他们是否提供了一个Web服务来查询用户帐户信息。您提出的模拟登录方法应该是最后的手段。

答案 2 :(得分:0)

你可以做的另一种方法是自动化IE,例如使用WebBrowser控件。这将更准确地模拟IE运行Javascript的所有聪明的东西,这可能是必要的。虽然如果不需要Javascript或其他聪明的东西,那么使用IE有点笨拙并且可能容易出现其他问题。