获取网页浏览器cookies登录

问题描述:

我正在创建一个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

得到帮助:

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; 
} 

我想你可能会把这些技术拉长一点点。 Windows窗体中的浏览器控件通常设计为从本地文件或互联网向您提供基本的HTML渲染,但不应该用它来替换完整的Web浏览器。

如果您想要对SSO提供程序进行身份验证,则必须使用正确的库(在本例中为Windows Identitity Foundation)和Microsoft.IdentityModel,您将获得声明身份验证机制以处理来自SSO提供程序的声明。 Cookie不能在应用程序间共享,实际上有些新的网络技术是为了避免这种情况而设计的,所以在我看来,尝试使用WIF而不是网页浏览器控件。

希望它有帮助,

+1

我不认为它是'SSO provider',他们只是有一些JavaScript的东西或类似的阻止两个连接帐户在同一时间。 – Jaanus 2013-02-24 09:41:10

你可以,但它有点棘手。与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:// *。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