2013-02-24 15 views
7

Tworzę aplikację formularzy okien, w której mam webbrowser control.Pierwsze ciasteczka przeglądarki internetowej do zalogowania

Po użytkownik loguje się z webbrowser, chcę zalogować się również z tego samego konta z Microsoft.Http.HttpClient lub HttpWebRequest lub podobna, powinna być podobna do cURL od PHP.

Problem polega na tym, że strona internetowa zezwala tylko na pojedyncze logowanie na konto i jeśli podpiszę się za pomocą HttpClient, to wyrzucę webbrowser.

Co chcę wiedzieć, czy jest możliwe, aby porwać webbrowser sesji lub uzyskać cookies i używać go w moim HttpClient lub podobnego api.

Mogę użyć webbrowser.Cookie, aby uzyskać dane, ale jak je przekazać na numer HttpClient?

Czy to możliwe, że mogę po prostu wziąć ciasteczka i skorzystać z tej samej sesji? Jeśli tak to jak?

+0

Jeśli ciasteczka są HttpOnly ciasteczka wtedy webbrowser nie będzie ich przechowywania. Zobacz [IEGetProtectedModeCookie] (https://msdn.microsoft.com/en-us/library/cc196998 (v = vs.85) .aspx) –

Odpowiedz

12

otrzymał pomoc stąd:

Is it possible to transfer authentication from Webbrowser to WebRequest

Alkampfer pisał rozwiązanie. Dokładnie tego potrzebowałem i działało.

Rozwiązanie to przyjmuje również pliki cookie w postaci Http only.

można wywołać metodę GetUriCookieContainer która zwraca państwu CookieContainer które mogą być wykorzystane do późniejszej rozmowy z WebRequest obiektu.

[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

Myślę, że możesz rozciągać technologie nieco zbyt daleko. Sterowanie przeglądarką w formularzach Windows jest zwykle zaprojektowane tak, aby zapewniało podstawowe renderowanie html z plików lokalnych lub Internetu, ale nie powinno zastępować pełnoprawnej przeglądarki internetowej.

Jeśli chcesz uwierzytelnić się u dostawcy SSO, musisz użyć odpowiednich bibliotek, w tym przypadku z Windows Identitity Foundation, z Microsoft.IdentityModel dostaniesz mechanizmy uwierzytelniania roszczeń, aby obsłużyć roszczenia od dostawcy SSO. Pliki cookie nie mogą być współdzielone między aplikacjami, w rzeczywistości niektóre nowe technologie internetowe są zaprojektowane właśnie po to, aby tego uniknąć, więc moim zdaniem spróbuj użyć WIF zamiast kontrolki przeglądarki.

Mam nadzieję, że pomoże,

+1

Nie sądzę, że jest to "dostawca SSO", mają po prostu javascript lub coś podobnego, które blokuje dwa połączenia z kontem w tym samym czasie. – Jaanus

3

Możesz, ale to trochę trudne. Użyj wywołania InternetSetCookie razem z CookieContainer z HttpWebRequest.

Oto sposób: http://msdn.microsoft.com/en-us/library/windows/desktop/aa385107(v=vs.85).aspx

i oto przykład, jak go ustawić: http://social.msdn.microsoft.com/Forums/en-SG/csharpgeneral/thread/76a38eee-3ef6-4993-a54d-3fecc4eb6cff

+0

Hmm Otrzymuję ciasteczka w następujący sposób: http: // stackoverflow.com/questions/650536/c-sharp-webrequest-using-webbrowser-cookie, druga odpowiedź tam i ustawienie HttpWebRequest, ale to nie działa, konto nie jest zalogowany. – Jaanus

+0

Czy ustawiasz własną instancję CookieContainer na HttpWebRequest? Ten kontener powinien zawierać plik cookie po wykonaniu żądania http. – ThomasArdal

+0

Ach przepraszam, nie widziałem, że już rozwiązałeś problem :) – ThomasArdal

Powiązane problemy