Очистка экрана: невозможно пройти проверку подлинности на сайте с использованием проверки подлинности форм ASP .NET.

Используя С# WebRequest, я пытаюсь просмотреть веб-сайт с использованием проверки подлинности форм ASP.NET.

Сначала приложение выполняет GET на странице входа и извлекает ключи __VIEWSTATE и __EVENTVALIDATION из скрытых полей ввода, а также .NET SessionId из файла cookie. Затем приложение выполняет POST с именем пользователя, паролем, другими обязательными полями формы и тремя вышеупомянутыми переменными .NET для действия формы.

Из сеанса Fiddler с использованием Chrome для аутентификации на веб-сайте я ожидаю 302 с токеном, хранящимся в файле cookie, чтобы обеспечить навигацию по защищенной области сайта. Я не могу понять, почему я продолжаю получать 302 без токена, перенаправляя меня на домашнюю страницу веб-сайта без аутентификации. В Fiddler запрос моего приложения выглядит точно так же, как запрос, сделанный в Chrome или Firefox.

        // Create a request using a URL that can receive a post. 
        var request = (HttpWebRequest)WebRequest.Create(LoginUrl);
        // Set the Method property of the request to POST.
        _container = new CookieContainer();

        request.UserAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.17 Safari/537.36";
        request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        request.Headers["Accept-Encoding"] = "gzip,deflate,sdch";
        request.Headers["Accept-Language"] = "en-US,en;q=0.8";

        var response = (HttpWebResponse)request.GetResponse();
        _container.Add(response.Cookies);

        string responseFromServer;

        using (var decompress = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress))
        {
            using (var reader = new StreamReader(decompress))
            {
                // Read the content.
                responseFromServer = reader.ReadToEnd();
            }
        }

        var doc = new HtmlDocument();
        doc.LoadHtml(responseFromServer);

        var hiddenFields = doc.DocumentNode.SelectNodes("//input[@type='hidden']").ToDictionary(input => input.GetAttributeValue("name", ""), input => input.GetAttributeValue("value", ""));

        request = (HttpWebRequest)WebRequest.Create(LoginUrl);

        request.Method = "POST";
        request.CookieContainer = _container;

        // Create POST data and convert it to a byte array.  Modify this line accordingly
        var postData = String.Format("ddlsubsciribers={0}&memberfname={1}&memberpwd={2}&chkRemberMe=true&Imgbtn=LOGIN&__EVENTTARGET&__EVENTARGUMENT&__LASTFOCUS", Agency, Username, Password);
        postData = hiddenFields.Aggregate(postData, (current, field) => current + ("&" + field.Key + "=" + field.Value));

        ServicePointManager.ServerCertificateValidationCallback = AcceptAllCertifications;

        var byteArray = Encoding.UTF8.GetBytes(postData);
        //request.UserAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.17 Safari/537.36";
        // Set the ContentType property of the WebRequest.
        request.ContentType = "application/x-www-form-urlencoded";
        request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        request.Headers["Accept-Encoding"] = "gzip,deflate,sdch";
        request.Headers["Accept-Language"] = "en-US,en;q=0.8";
        // Set the ContentLength property of the WebRequest.
        request.ContentLength = byteArray.Length;
        // Get the request stream.
        var dataStream = request.GetRequestStream();
        // Write the data to the request stream.
        dataStream.Write(byteArray, 0, byteArray.Length);
        // Close the Stream object.
        dataStream.Close();
        // Get the response.
        response = (HttpWebResponse)request.GetResponse();
        _container.Add(response.Cookies);

        // Clean up the streams.
        dataStream.Close();
        response.Close();

person Ben    schedule 16.09.2013    source источник


Ответы (1)


Как оказалось, некоторые странные символы в переменной __EVENTVALIDATION были закодированы в разрыв строки, и ASP.NET затем выбросил сеанс, предполагая, что он был поврежден. Решение состояло в том, чтобы экранировать переменные ASP.NET, используя Uri.EscapeDataString.

postData = hiddenFields.Aggregate(postData, (current, field) => current + ("&" + field.Key + "=" + Uri.EscapeDataString(field.Value)));
person Ben    schedule 16.09.2013