2013-03-22 68 views
11

我有一個應用程序通過HTTPS向API發送用戶名和密碼。該API返回HTTPOnly cookie。在Windows Phone上保留HTTPOnly Cookie

這意味着cookie對代碼「不可見」,但仍然存在並將在隨後的請求中發送到服務器。

Set-Cookie頭從HttpWebResponse.Headers剝離和cookie不出現在HttpWebResponse.Cookie S或所述HttpWebRequest.CookieContainer。但是,如果後續請求使用相同的HttpWebRequest.CookieContainer進行發送,則會將其發送到服務器,但代碼無法訪問它們。

據我所知,這使得他們無法以任何方式進行序列化或保存。似乎做這項工作的唯一方法是每次緩存實際的用戶名和密碼並再次登錄。

有什麼我失蹤?

+0

可以序列化整個'CookieContainer'(http://answers.flyppdevportal.com/categories/metro/csharpvb.aspx?id=d214c388-41de-44b7-8260-9e21f3fcb859),並在需要時重新使用整個容器嗎? – keyboardP 2013-04-06 13:46:11

+0

您無法操作httponly cookie。只有在您發送http請求時纔會修改它們。這對於服務器和客戶端之間的安全通信至關重要。所以你所面對的這種行爲是正常的。 – user568109 2013-04-06 14:25:48

+0

@keyboardP如果您將CookieContainer序列化,則在反序列化時不再發送Cookie。 – zi3guw 2013-04-06 15:29:59

回答

3

您將不得不使用反射來查看存儲在cookie容器中的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(); 
    } 
+0

當使用反射訪問Windows Phone上的非公共類型時,您沒有發現MethodAccessException?每次我嘗試這樣做時都失敗 – calum 2013-04-13 10:01:32

+0

好catch。internal和protected應該是可以的,但是私人的肯定不是。查看CookieContainer的源代碼,這應該工作,否則它將是一個遮罩建立一個基於源代碼的自定義cookie容器類,並利用它來代替。 – 2013-04-13 10:17:19

+0

我甚至不能編譯WP8上的這段代碼(散列表,SortedList都丟失了)。 – altso 2013-08-13 13:40:55

1

您也可以嘗試使用TCP套接字直接獲取Cookie。下面是我對類似問題的回答:https://stackoverflow.com/a/21737087/262036

一旦得到響應,您就會分析字符串以搜索cookie並獲取該值。之後,您可以在CookieContainer中創建一個不是HttpOnly的新cookie,並在接下來的請求中使用它。