2013-02-24 11 views
7

Ich erstelle eine Windows Forms App, wo ich eine webbrowser control habe.Webbrowser-Cookies zum Anmelden

Nach Benutzer anmeldet mit dem webbrowser, möchte ich auch mit Microsoft.Http.HttpClient mit demselben Konto einloggen oder HttpWebRequest oder ähnlich, sollte es zu cURL von PHP ähnlich sein.

Problem ist, dass die Webseite nur Single Sign On pro Account erlaubt und wenn ich mit HttpClient unterzeichne, wird es den Webbrowser rauswerfen.

Was ich möchte wissen, ob es möglich ist webbrowser Session zu übernehmen oder die cookies bekommen und es api in meinem HttpClient oder ähnliches zu verwenden.

Ich kann webbrowser.Cookie verwenden, um einige Daten zu bekommen, aber wie man es auf HttpClient schieben?

Ist das überhaupt möglich, dass ich einfach die Cookies nehmen und die gleiche Sitzung verwenden kann? Wenn das so ist, wie?

+0

Wenn die Cookies Httponly-Cookies sind dann die Web-Browser sie nicht speichern. Siehe [IEGetProtectedModeCookie] (https://msdn.microsoft.com/en-us/library/cc196998 (v = vs.85) .aspx) –

Antwort

12

Got Hilfe von hier:

Is it possible to transfer authentication from Webbrowser to WebRequest

Alkampfer Lösung veröffentlicht. Genau das habe ich gebraucht und es hat funktioniert.

Diese Lösung benötigt auch Http only Cookies.

Sie können die GetUriCookieContainer-Methode aufrufen, die Ihnen einen CookieContainer zurückgibt, der für den nachfolgenden Aufruf mit WebRequest-Objekt verwendet werden kann.

[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

Ich denke, Sie könnten die Technologien ein wenig zu weit strecken. Das Webbrowser-Steuerelement in Windows-Formularen ist normalerweise so konzipiert, dass Sie grundlegende HTML-Renderings von lokalen Dateien oder dem Internet erhalten. Es sollte jedoch nicht dazu verwendet werden, einen vollständigen Webbrowser zu ersetzen.

Wenn Sie sich bei einem SSO-Provider authentifizieren möchten, müssen Sie die richtigen Bibliotheken verwenden, in diesem Fall von Windows Identity Foundation. Mit Microsoft.IdentityModel erhalten Sie Mechanismen zur Forderungsauthentifizierung, um die Ansprüche Ihres SSO-Providers zu bearbeiten. Cookies können nicht über mehrere Anwendungen verteilt werden. Tatsächlich sind einige neue Webtechnologien darauf ausgelegt, dies zu vermeiden, weshalb ich meiner Meinung nach versuche, WIF anstatt eines Webbrowser-Steuerelements zu verwenden.

Hoffe, dass es hilft,

+1

Ich glaube nicht, dass es "SSO-Anbieter" ist, sie haben nur eine Art von Javascript-Sache oder Ähnliches, das zwei Verbindungen blockiert, um gleichzeitig zu berichten. – Jaanus

3

können Sie, aber es ist ein bisschen schwierig. Verwenden Sie den InternetSetCookie-Aufruf zusammen mit einem CookieContainer von HttpWebRequest.

Hier ist die Methode: http://msdn.microsoft.com/en-us/library/windows/desktop/aa385107(v=vs.85).aspx

und hier ist ein Beispiel, wie man es fest: http://social.msdn.microsoft.com/Forums/en-SG/csharpgeneral/thread/76a38eee-3ef6-4993-a54d-3fecc4eb6cff

+0

Hmm Ich bekomme die Cookies so: http: // stackoverflow.com/questions/650536/c-sharp-webrequest-using-webbrowser-cookie, die zweite Antwort dort, und Einstellung auf HttpWebRequest, aber es funktioniert nicht, Konto ist nicht angemeldet. – Jaanus

+0

Setzen Sie Ihre eigene Instanz von der CookieContainer auf der HttpWebRequest? Dieser Container sollte das Cookie enthalten, nachdem die http-Anfrage ausgeführt wurde. – ThomasArdal

+0

Ah sorry sah nicht, dass Sie das Problem bereits gelöst haben :) – ThomasArdal