2013-02-24 112 views
7

我正在創建一個Windows窗體應用程序,我有一個webbrowser control獲取網頁瀏覽器cookies登錄

用戶與webbrowser登錄後,我也想登錄與同一帳戶Microsoft.Http.HttpClientHttpWebRequest或類似的,它應該是從PHP類似cURL

問題是,網頁只允許每個帳戶單一登錄,如果我用HttpClient簽名,它會將網頁瀏覽器踢出。

我想知道什麼,是否有可能劫持webbrowser會話或獲取cookies在我HttpClient或類似api使用它。

我可以使用webbrowser.Cookie來獲得一些數據,但如何將它推到HttpClient

這種事情甚至可能,我可以只吃餅乾和使用相同的會話?如果是這樣,怎麼樣?

+0

如果Cookie是僅Http Cookie,然後在web瀏覽器不會保存。請參閱[IEGetProtectedModeCookie](https://msdn.microsoft.com/en-us/library/cc196998(v = vs.85).aspx) – 2016-04-13 18:31:00

回答

12

得到幫助:

Is it possible to transfer authentication from Webbrowser to WebRequest

Alkampfer發佈的解決方案。這正是我所需要的,它的工作。

此解決方案還需要Http only Cookie。

您可以調用GetUriCookieContainer方法,該方法返回一個CookieContainer,可用於隨後使用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

我想你可能會把這些技術拉長一點點。 Windows窗體中的瀏覽器控件通常設計爲從本地文件或互聯網向您提供基本的HTML渲染,但不應該用它來替換完整的Web瀏覽器。

如果您想要對SSO提供程序進行身份驗證,則必須使用正確的庫(在本例中爲Windows Identitity Foundation)和Microsoft.IdentityModel,您將獲得聲明身份驗證機制以處理來自SSO提供程序的聲明。 Cookie不能在應用程序間共享,實際上有些新的網絡技術是爲了避免這種情況而設計的,所以在我看來,嘗試使用WIF而不是網頁瀏覽器控件。

希望它有幫助,

+1

我不認爲它是'SSO provider',他們只是有一些JavaScript的東西或類似的阻止兩個連接帳戶在同一時間。 – Jaanus 2013-02-24 09:41:10

3

你可以,但它有點棘手。與HttpWebRequest的CookieContainer一起使用InternetSetCookie調用。

這裏的方法:http://msdn.microsoft.com/en-us/library/windows/desktop/aa385107(v=vs.85).aspx

,這裏是如何設置的例子:從這裏http://social.msdn.microsoft.com/Forums/en-SG/csharpgeneral/thread/76a38eee-3ef6-4993-a54d-3fecc4eb6cff

+0

嗯,我得到這樣的餅乾:http:// stackoverflow。com/questions/650536/c-sharp-webrequest-using-webbrowser-cookie,第二個答案在那裏,並設置爲HttpWebRequest,但它不工作,帳戶未登錄。 – Jaanus 2013-02-24 11:07:51

+0

您是否設置了您自己的實例HttpWebRequest上的CookieContainer?在完成http請求後,這個容器應該包含cookie。 – ThomasArdal 2013-02-25 17:53:53

+0

對不起,沒有看到你已經解決了這個問題:) – ThomasArdal 2013-02-25 17:54:19