2013-03-22 7 views
11

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

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

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

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

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

+0

Можете ли вы сериализовать весь «CookieContainer» (http://answers.flyppdevportal.com/categories/metro/csharpvb.aspx?ID=d214c388-41de-44b7-8260-9e21f3fcb859) и повторно использовать весь контейнер при необходимости? – keyboardP

+0

Вы не можете манипулировать файлом httponly cookie. Они изменяются только при отправке HTTP-запросов. Это важно для безопасной связи между сервером и клиентом. Таким образом, это поведение, с которым вы сталкиваетесь, является нормальным. – user568109

+0

@keyboardP Если вы сериализуете CookieContainer, то когда он несертифицирован, файлы cookie больше не отправляются. – zi3guw

ответ

3

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

Используйте что-то подобное, чтобы посмотреть, что у вас есть, затем вы можете либо попробовать подкласс, чтобы получить доступ к требуемым данным, либо пройти процесс хранения файла 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(); 
    } 
+0

Вы не получаете исключение MethodAccessException при использовании отражения для доступа к непубличным типам на Windows Phone? Каждый раз, когда я пытался это сделать, он потерпел неудачу. – calum

+0

good Удовлетворение внутреннего и защищенного должно быть в порядке, но конфиденциально нет. Если посмотреть на источник для CookieContainer, это должно сработать. Если нет, это будет матовый r создания пользовательского класса контейнера cookie на основе источника и использования этого вместо этого. –

+0

Я даже не могу скомпилировать этот код на WP8 (Hashtable, SortedList отсутствуют). – altso

1

Вы также можете попробовать использовать TCP-сокеты, чтобы получить файлы cookie напрямую. Вот мой ответ по аналогичному вопросу: https://stackoverflow.com/a/21737087/262036

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

Смежные вопросы