C# HttpWebRequest POST с базой c Проверка подлинности успешна, но следующий запрос GET Несанкционированный 401 с хорошими учетными данными - PullRequest
0 голосов
/ 24 марта 2020

Я делаю HttpWebRequest, используя asp. net для получения данных. Мой первый запрос к странице входа выполнен успешно, и я могу пройти проверку подлинности с помощью POST. Однако, когда я пытаюсь перейти на другую страницу, используя те же учетные данные и передавая файлы cookie, я получаю ошибку Unauthorized 401.

Мой код неверен? Я что-то упустил, чтобы заставить это работать на этом сайте?

Мой код:

        public static void WebServiceTest()
    {
        Uri uri = new Uri("https://www.***.com/home/.../#/login");
        Uri uriDomain = new Uri("https://www.***.com");
        Uri uri2 = new Uri("https://www.***.com/home/api/.../menus");
        string username = "*****";
        string password = "*****";

        NetworkCredential cred = new NetworkCredential(username, password);
        CredentialCache cache = new CredentialCache();
        cache.Add(uri, "Basic", cred);

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.AllowAutoRedirect = true;
        request.KeepAlive = true;
        request.CookieContainer = new CookieContainer();

        //make first response
        using (var response = (HttpWebResponse)request.GetResponse())
        {
            // Print the properties of each cookie for testing
            foreach (Cookie cook in response.Cookies)
            {
                System.Diagnostics.Debug.WriteLine("Cookie:");
                System.Diagnostics.Debug.WriteLine($"{cook.Name} = {cook.Value}");
                System.Diagnostics.Debug.WriteLine($"Domain: {cook.Domain}");
                System.Diagnostics.Debug.WriteLine($"Path: {cook.Path}");
                System.Diagnostics.Debug.WriteLine($"Port: {cook.Port}");
                System.Diagnostics.Debug.WriteLine($"Secure: {cook.Secure}");

                System.Diagnostics.Debug.WriteLine($"When issued: {cook.TimeStamp}");
                System.Diagnostics.Debug.WriteLine($"Expires: {cook.Expires} (expired? {cook.Expired})");
                System.Diagnostics.Debug.WriteLine($"Don't save: {cook.Discard}");
                System.Diagnostics.Debug.WriteLine($"Comment: {cook.Comment}");
                System.Diagnostics.Debug.WriteLine($"Uri for comments: {cook.CommentUri}");
                System.Diagnostics.Debug.WriteLine($"Version: RFC {(cook.Version == 1 ? 2109 : 2965)}");

                // Show the string representation of the cookie.
                System.Diagnostics.Debug.WriteLine($"String: {cook}");
            }

            Stream resStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(resStream);
            string text = reader.ReadToEnd();

            //check response output
            System.Diagnostics.Debug.WriteLine(text);

            //now setup second request
            var request2 = (HttpWebRequest)WebRequest.Create(uri2);
            request2.Credentials = cache;
            request2.Method = "GET";
            request2.ContentType = "text/xml; encoding='utf-8'";

            //setup cookie container for new httpwebrequest by
            //setting container to first request container
            CookieContainer cookieJar = new CookieContainer();
            cookieJar = request.CookieContainer;
            request2.CookieContainer = cookieJar;

            //just in case, add username and password cookies
            var userCookie = new Cookie("username", "*****");
            var pswdCookie = new Cookie("password", "*****");
            request2.CookieContainer.Add(uriDomain, userCookie);
            request2.CookieContainer.Add(uriDomain, pswdCookie);

            System.Diagnostics.Debug.WriteLine("** LINE BREAK **");

            //check what is in the second request cookie container
            foreach (Cookie cook in request2.CookieContainer.GetCookies(uriDomain))
            {
                System.Diagnostics.Debug.WriteLine(cook.Name + ":" + cook.Value);
            }

            //get second response
            using (var response2 = (HttpWebResponse)request2.GetResponse())
            {
                Stream resStream2 = response2.GetResponseStream();
                StreamReader reader2 = new StreamReader(resStream2);
                string text2 = reader2.ReadToEnd();

                response2.Close();
            }

            // Close the original response.  
            response.Close();
        }
    }

Я также должен сказать, что разработчик сайта сказал мне, что их сайт " извлекает токен только через пользовательский интерфейс, и этот токен используется при последующих вызовах API". Но это не должно помешать мне перескакивать или нет?

Спасибо,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...