使用webRequest在网站上进行身份验证会导致错误403

时间:2016-02-23 12:54:13

标签: c# webrequest

在我的同事在互联网上搜索了将近2天之后,我找不到可以帮助我的解决方案...这就是我需要你帮助的原因:)

我的问题在于webRequest可以连接到银行网站,使用Id和密码连接,获取一些信息并将它们还给我。

到现在为止,我为一家银行做了它并且工作得很好,但是我需要和另一家银行合作,对于新银行,我之前做过的事情不想工作。

最大的问题是我尝试连接的wbesite给出的请求的响应,我有一个:“远程服务器返回错误:(403)禁止。 我看到互联网上的很多人都遇到了webRequest和403错误的问题,并尝试了所有可能的事情。 无论我尝试什么,设置默认标题,我自己做的标题或其他任何我得到此错误。即使我的ID&密码是假我收到此错误,所以我甚至无法连接到该网站。

我现在的理论是,我正在尝试连接到我无法访问的剧目页面,并且我的HttpHeader是在连接的URI之后,是不可能的,也不起作用对于这家银行。

我也尝试更改线程时间(看看他们是否拒绝访问,因为连接不是人) 我试图pu用户代理,它什么都没改变。 可以帮助我的东西:我可以像以前一样在uri中传递连接信息吗?或者还有另一种方法可行吗?

PS:如果您需要其他或更精确的信息,请不要犹豫。

这是代码。

感谢您的帮助。

public static List<Compte> requeteBank(PopUpWebRequest popup)
    {

        List<Compte> listeCompte = new List<Compte>();
        ASCIIEncoding encoding = new ASCIIEncoding();

        string contentHTTPHeader = "_cm_user" + id + "&_cm_pwd" + password;
        byte[] data = encoding.GetBytes(contentHTTPHeader);


        string urlConnexion = "https://www.bank.fr/identification/default.cgi"; // This URI doesn't exist, this is for the example
        HttpWebRequest requeteConnexion = (HttpWebRequest)WebRequest.Create(urlConnexion);

        //I even tried with this method 
        // I left this here to show you how I made this 
        //string authInfo = popup.identifiant + ":" + popup.password; 
        //requeteConnexion.Headers["Authorization"] = "Basic " + authInfo;
        //var response = requeteConnexion.GetResponse();
        //authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));

        //The form for the Id & Password is a Method POST
        requeteConnexion.Method = "POST";
        Stream connexionStream = requeteConnexion.GetRequestStream();

        // Sending connection data...
        connexionStream.Write(data, 0, data.Length);
        connexionStream.Close();

        requeteConnexion.CookieContainer = new CookieContainer();

        requeteConnexion.AllowAutoRedirect = false;

        HttpWebResponse reponseConnexion = (HttpWebResponse)requeteConnexion.GetResponse(); // Error 403
        //Id from the cookies
        Cookie idSession = reponseConnexion.Cookies["IdSes"];
        reponseConnexion.Close();
        [ The rest of the code.... ]

1 个答案:

答案 0 :(得分:0)

好消息,我发现了我的问题,所以我给出了完整的答案,可能会帮助将来的某个人:) 谢谢所有帮助过我的人!

我的程序中缺少两个正常工作的东西。

首先,所有银行都不一样,即使它们来自同一个子公司,也不会使用相同的HTTP标头。 所以我在Mozilla Firefox中使用了一个插件https://addons.mozilla.org/fr/firefox/addon/live-http-headers/来显示网站的标题和手动连接时的响应。

有了这个,我在创建请求时添加了很多不同的信息,这些信息都在银行网站的标题中:

requeteConnexion.Method = "POST";
requeteConnexion.ContentType = "application/x-www-form-urlencoded";
requeteConnexion.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0";
requeteConnexion.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9*/*;q=0.8";
requeteConnexion.KeepAlive = true;

我的第二个错误是string contentHTTPHeader = "_cm_user" + id + "&_cm_pwd" + password; 我删除了名称和值之间的空格,我忘了放一个&#34; =&#34;在名字之后。 好的路线是 string contentHTTPHeader = "_cm_user="+id+"&_cm_pwd="+password;

对于想要知道的人来说,&#34; _cm_user =&#34;等等...来自,我可以看到当我手动连接的插件时,这是如何在标头中发送的ID和密码,我只需要在我的代码中添加完全相同的东西。

希望这可以提供帮助。