2013-02-24 19 views
7

Sto creando un'app di Windows Form, dove ho uno webbrowser control.Ottenere i cookie del browser per accedere

Dopo utente accede con il webbrowser, voglio il login anche con lo stesso account con Microsoft.Http.HttpClient o HttpWebRequest o simili, dovrebbe essere simile a cURL da PHP.

Il problema è che la pagina Web consente solo il singolo accesso per account e se firmo con HttpClient, questo farà scappare il browser.

Quello che voglio sapere, se è possibile dirottare webbrowser sessione o di ottenere il cookies e usarlo nella mia HttpClient o simili api.

Posso usare webbrowser.Cookie per ottenere alcuni dati, ma come spingerlo a HttpClient?

Questo tipo di cose è anche possibile, che posso semplicemente prendere i cookie e utilizzare la stessa sessione? Se é cosi, come?

+0

Se i cookie sono cookie HttpOnly poi il browser web non memorizzerà loro. Vedere [IEGetProtectedModeCookie] (https://msdn.microsoft.com/en-us/library/cc196998 (v = vs.85) .aspx) –

risposta

12

Got aiuto da qui:

Is it possible to transfer authentication from Webbrowser to WebRequest

Alkampfer postato soluzione. Questo è esattamente ciò di cui avevo bisogno e ha funzionato.

Questa soluzione richiede anche i cookie Http only.

È possibile chiamare il metodo GetUriCookieContainer che restituisce un CookieContainer che può essere utilizzato per la chiamata successiva con oggetto WebRequest.

[DllImport("wininet.dll", SetLastError = true)] 
    public static extern bool InternetGetCookieEx(
     string url, 
     string cookieName, 
     StringBuilder cookieData, 
     ref int size, 
     Int32 dwFlags, 
     IntPtr lpReserved); 

    private const Int32 InternetCookieHttponly = 0x2000; 

/// <summary> 
/// Gets the URI cookie container. 
/// </summary> 
/// <param name="uri">The URI.</param> 
/// <returns></returns> 
public static CookieContainer GetUriCookieContainer(Uri uri) 
{ 
    CookieContainer cookies = null; 
    // Determine the size of the cookie 
    int datasize = 8192 * 16; 
    StringBuilder cookieData = new StringBuilder(datasize); 
    if (!InternetGetCookieEx(uri.ToString(), null, cookieData, ref datasize, InternetCookieHttponly, IntPtr.Zero)) 
    { 
     if (datasize < 0) 
      return null; 
     // Allocate stringbuilder large enough to hold the cookie 
     cookieData = new StringBuilder(datasize); 
     if (!InternetGetCookieEx(
      uri.ToString(), 
      null, cookieData, 
      ref datasize, 
      InternetCookieHttponly, 
      IntPtr.Zero)) 
      return null; 
    } 
    if (cookieData.Length > 0) 
    { 
     cookies = new CookieContainer(); 
     cookies.SetCookies(uri, cookieData.ToString().Replace(';', ',')); 
    } 
    return cookies; 
} 
1

Penso che potresti allungare un po 'troppo le tecnologie. Il controllo del browser nelle finestre di solito è progettato per fornire un rendering html di base da file locali o Internet, ma non dovrebbe essere usato per sostituire un browser web full-fledge.

Se si desidera eseguire l'autenticazione con un provider SSO, è necessario utilizzare le librerie corrette, in questo caso da Windows Identitity Foundation, con Microsoft.IdentityModel si otterranno meccanismi di autenticazione delle attestazioni per gestire le attestazioni dal provider SSO. I cookie non possono essere condivisi tra le applicazioni, infatti alcune nuove tecnologie web sono progettate proprio per evitarlo, quindi, a mio parere, provare a utilizzare WIF invece di un controllo del browser.

Speranza che aiuta,

+1

Non penso che sia il 'provider SSO', hanno solo un po 'di cosa javascript o simile che blocca due connessioni all'account nello stesso tempo. – Jaanus

3

È possibile, ma è un po 'complicato. Utilizzare la chiamata InternetSetCookie insieme a CookieContainer da HttpWebRequest.

Ecco il metodo: http://msdn.microsoft.com/en-us/library/windows/desktop/aa385107(v=vs.85).aspx

ed ecco un esempio su come impostarlo: http://social.msdn.microsoft.com/Forums/en-SG/csharpgeneral/thread/76a38eee-3ef6-4993-a54d-3fecc4eb6cff

+0

Hmm Ricevo i cookie in questo modo: http: // StackOverflow.it/questions/650536/c-sharp-webrequest-using-webbrowser-cookie, la seconda risposta e impostazione su HttpWebRequest, ma non funziona, l'account non è collegato. – Jaanus

+0

Stai impostando la tua istanza di il CookieContainer su HttpWebRequest? Questo contenitore dovrebbe contenere il cookie dopo aver effettuato la richiesta http. – ThomasArdal

+0

Ah scusa non ho visto che hai già risolto il problema :) – ThomasArdal

Problemi correlati