2013-03-22 12 views
11

Ho un'app che invia un nome utente e una password a un'API tramite HTTPS. L'API restituisce cookie HTTPOnly.Conservazione dei cookie HTTPOnly su Windows Phone

Ciò significa che i cookie sono "invisibili" al codice, ma esistono ancora e verranno inviati al server nelle richieste successive.

L'intestazione Set-Cookie è spogliato dal HttpWebResponse.Headers e il cookie non viene visualizzato nei HttpWebResponse.Cookie s o HttpWebRequest.CookieContainer. Tuttavia, se viene effettuata una richiesta successiva utilizzando lo stesso HttpWebRequest.CookieContainer, questi vengono inviati al server, ma non sono accessibili al codice.

Per quanto ne so, questo li rende impossibili da serializzare o conservare in alcun modo. Sembra che l'unico modo per fare questo lavoro sia memorizzare nella cache il nome utente e la password effettivi e accedere di nuovo ogni volta.

C'è qualcosa che mi manca?

+0

È possibile serializzare l'intero 'CookieContainer' (http://answers.flyppdevportal.com/categories/metro/csharpvb.aspx?ID=d214c388-41de-44b7-8260-9e21f3fcb859) e riutilizzare l'intero contenitore quando richiesto? – keyboardP

+0

Non è possibile modificare cookie httponly. Vengono modificati solo quando si inviano richieste HTTP. È essenziale per una comunicazione sicura tra server e client. Quindi questo comportamento che stai affrontando è normale. – user568109

+0

@keyboardP Se si serializza CookieContainer, quando non è serializzato, i cookie non vengono più inviati. – zi3guw

risposta

3

Dovrai utilizzare la riflessione per dare un'occhiata ai cookie memorizzati nel contenitore dei cookie.

Utilizzare qualcosa come questo per dare un'occhiata a ciò che si ha, quindi si può provare a sottoclasse per ottenere l'accesso ai dati che si desidera o passare attraverso il processo di memorizzazione del cookie in memoria, eliminandolo dal contenitore, poi aggiungerlo come un biscotto normale

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

Non si ottiene una eccezione MethodAccessException quando si utilizza la reflection per accedere a tipi non pubblici su Windows Phone? Ogni volta che ho provato a farlo, non è riuscito. – calum

+0

good catch, internal e protected dovrebbe essere OK, ma sicuramente non lo è. Guardando all'origine di CookieContainer, questo dovrebbe funzionare. In caso contrario, sarà un mascherino r di costruire una classe contenitore di cookie personalizzata basata sull'origine e sfruttando quella invece. –

+0

Non riesco nemmeno a compilare questo codice su WP8 (Hashtable, SortedList sono mancanti). – altso

1

si può anche provare a utilizzare TCP Socket per ottenere direttamente i biscotti. Ecco la mia risposta per una domanda simile: https://stackoverflow.com/a/21737087/262036

Una volta ottenuta la risposta, si analizza la stringa in cerca del cookie e si acquisisce il valore. Dopodiché puoi creare un nuovo cookie in CookieContainer che non è HttpOnly e usarlo nelle prossime richieste.

Problemi correlati