Аутентификация при использовании WebRequest и WebResponse

311
28 апреля 2017, 16:36

Нужно авторизоваться на сайте по протоколу https - при помощи WebRequest и WebResponse (сама программа на ASP.NET MVC)

 HttpWebRequest requestG = (HttpWebRequest)WebRequest.Create("https://ua.baza-broker.com:443");
        requestG.AllowAutoRedirect = false;
        HttpWebResponse responseG = (HttpWebResponse)requestG.GetResponse();
    //    responseG.Close();
        X509Certificate2 cert = new X509Certificate2(requestG.ServicePoint.Certificate);
        #endregion
        HttpWebResponse result = null;
        HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("https://ua.baza-broker.com");
        req.Method = "POST";
        req.ContentType = "application/x-www-form-urlencoded";
        req.Accept = "";
        byte[] SomeBytes = null;
        string FormParams = "login={здесь_логин}&password={здесь_пароль}";
        SomeBytes = Encoding.UTF8.GetBytes(FormParams);
        req.ContentLength = SomeBytes.Length;
        Stream newStream = req.GetRequestStream();
        newStream.Write(SomeBytes, 0, SomeBytes.Length);
        newStream.Close();
        result = (HttpWebResponse)req.GetResponse();
        Stream ReceiveStream = result.GetResponseStream();
        Encoding encode = Encoding.GetEncoding("utf-8");
        StreamReader sr = new StreamReader(ReceiveStream, encode);
        string answer = sr.ReadToEnd();
        sr.Close();
        result.Close();
        List<string> cookieVal = new List<string>();
        CookieContainer contCook = new CookieContainer();

        for (int i = 0; i < cookieVal.Count; i++)
        {
            string strRaw = cookieVal[i].Substring(0, cookieVal[i].IndexOf(";"));
            string strName = strRaw.Substring(0, strRaw.IndexOf("="));
            string strValue = strRaw.Substring(strRaw.IndexOf("=") + 1, strRaw.Length - strRaw.IndexOf("=") - 1);
            Cookie kuk = new Cookie(strName, strValue);
            kuk.Path = "/";
            kuk.Domain = "ua.baza-broker.com";
            contCook.Add(kuk);
        }
        //---------  Дополнительные куки ---------------------
        Cookie kukUL = new Cookie("ul", "211c1e0b83b9c69fa9c4bdede203c1e3");
        kukUL.Path = "/";
        kukUL.Domain = "ua.baza-broker.com";
        kukUL.Expires = DateTime.Now.AddYears(3);
        contCook.Add(kukUL);
        Cookie kukga = new Cookie("_ga", "GA1.2.1115745583.1493126015");
        kukga.Path = "/";
        kukga.Domain = "baza-broker.com";
        kukga.Expires = DateTime.Now.AddYears(3);
        contCook.Add(kukga);
        Cookie kukgat = new Cookie("_gat", "1");
        kukgat.Path = "/";
        kukgat.Domain = "baza-broker.com";
        kukgat.Expires = DateTime.Now.AddYears(3);
        contCook.Add(kukgat);
        //  _ga = GA1.2.1115745583.1493126015; _gat = 1;
        //---------  Дополнительный кук ---------------------
        string strData = DateTime.Now.Date.ToString("yyyy-MM-dd");
        string strGetJson = $"https://ua.baza-broker.com/index.php?do=baza&type=sale&page=1&region=3&per_page=50&dt={strData}%2C{strData}&sub_type=flat&isset_photo=&object_type=1&area%5B%5D=&area%5B%5D=&tarea%5B%5D=&tarea%5B%5D=&larea=&larea=&karea=&karea=&price%5B%5D=&price%5B%5D=&currency=0&floor=&floors=&view=list&view=table";
        HttpWebRequest req1 = (HttpWebRequest)HttpWebRequest.Create(strGetJson);
        req1.ClientCertificates.Add(cert);
        req1.UserAgent = "Mozilla/4.0+(compatible;+MSIE+5.01;+Windows+NT+5.0)";
        //Вот оно - важное дополнение.
        req1.CookieContainer = contCook;
        req1.Method = "GET";
        HttpWebResponse result1 = (HttpWebResponse)req1.GetResponse();
        Stream ReceiveStream1 = result1.GetResponseStream();
        StreamReader sr2 = new StreamReader(ReceiveStream1, encode);
        string html = sr2.ReadToEnd();
        Console.WriteLine(html);
        result1.Close();

Куки вроде возвращаются и сертификат вроде есть, но показывает что авторизоваться всё-таки не удалось....

Answer 1

Сталкивался с подобным, попробуй сделать следующее:

private string GetEncodedCredentials()
{   
    string mergedCredentials = string.Format("{0}:{1}", login, password);
    byte[] byteCredentials = UTF8Encoding.UTF8.GetBytes(mergedCredentials);
    return Convert.ToBase64String(byteCredentials);
}

Ну и использовать у себя уже

string base64Credentials = GetEncodedCredentials();
request.Headers.Add("Authorization", "Basic " + base64Credentials);
READ ALSO
Как получить названия всех папок С# MailKit

Как получить названия всех папок С# MailKit

Как получить названия всех папок почты с помощью библиотеки MailKit

245
&ldquo;Засыпание&rdquo; программы на некоторое время

“Засыпание” программы на некоторое время

Нужно приостанавливать программу на некоторое время в некотором местеПытаюсь сделать так, чтобы между текстом пользователя и выводом ответа...

261
TcpClient не поспевает за данными от сервера

TcpClient не поспевает за данными от сервера

Проблема: отправляю данные с сервера на клиент (оба на локальной машине) и часть данных клиент не успевает обработать/принять в буферИногда...

332
Как привязать (Binding) команду (ICommand) к кнопке на FluentRibbon из UserControl (MVVM)

Как привязать (Binding) команду (ICommand) к кнопке на FluentRibbon из UserControl (MVVM)

В проекте имеется много разных сущностей, которые надо отображать и списком в таблице и подробно и иметь возможность каждую правитьДля этого...

386