Сохранение файлов cookie HTTPOnly на Windows Phone

У меня есть приложение, которое отправляет имя пользователя и пароль в API через HTTPS. API возвращает HTTPOnly файлы cookie.

Это означает, что файлы cookie "невидимы" для кода, но все еще существуют и будут отправляться на сервер в последующих запросах.

Заголовок Set-Cookie удаляется из HttpWebResponse.Headers, и файл cookie не отображается в HttpWebResponse.Cookie или HttpWebRequest.CookieContainer. Однако, если последующий запрос выполняется с использованием того же HttpWebRequest.CookieContainer, они отправляются на сервер, но они недоступны для кода.

Насколько я могу судить, это делает невозможным сериализацию или сохранение в любом случае. Кажется, единственный способ сделать эту работу - кэшировать фактическое имя пользователя и пароль и снова войти в систему каждый раз.

Есть ли что-то, что мне не хватает?

Ответ 1

Вам нужно будет использовать отражение, чтобы посмотреть куки, хранящиеся в контейнере cookie.

Используйте что-то подобное, чтобы посмотреть на то, что у вас есть, затем вы можете либо попробовать подкласс, чтобы получить доступ к нужным вам данным, либо пройти процесс хранения файла cookie в памяти, удалив его из контейнера, затем добавив его как обычный файл cookie

    public List<Cookie> GetAllCookies(CookieContainer cc)
    {
        List<Cookie> lstCookies = new List<Cookie>();

        Hashtable table = (Hashtable)cc.GetType().InvokeMember("m_domainTable", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, null, cc, new object[] { });

        foreach (var pathList in table.Values)
        {
            SortedList lstCookieCol = (SortedList)pathList.GetType().InvokeMember("m_list", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, null, pathList, new object[] { });
            foreach (CookieCollection colCookies in lstCookieCol.Values)
                foreach (Cookie c in colCookies) lstCookies.Add(c);
        }

        return lstCookies;
    }
    public string ShowAllCookies(CookieContainer cc)
    {
        StringBuilder sb = new StringBuilder();
        List<Cookie> lstCookies = GetAllCookies(cc);
        sb.AppendLine("=========================================================== ");
        sb.AppendLine(lstCookies.Count + " cookies found.");
        sb.AppendLine("=========================================================== ");
        int cpt = 1;
        foreach (Cookie c in lstCookies)
            sb.AppendLine("#" + cpt++ + "> Name: " + c.Name + "\tValue: " + c.Value + "\tDomain: " + c.Domain + "\tPath: " + c.Path + "\tExp: " + c.Expires.ToString());

        return sb.ToString();
    }

Ответ 2

Вы также можете попробовать использовать TCP Sockets для получения файлов cookie напрямую. Вот мой ответ на аналогичный вопрос: fooobar.com/info/486829/...

Как только вы получите ответ, вы проанализируете строку в поисках файла cookie и получите значение. После этого вы можете создать новый файл cookie в CookieContainer, который не является HttpOnly и использовать его в следующих запросах.