获取webbrowser cookie登录

时间:2013-02-24 08:10:32

标签: c# .net cookies webbrowser-control

我正在创建一个Windows窗体应用,我有一个webbrowser control

用户使用webbrowser登录后,我想使用Microsoft.Http.HttpClientHttpWebRequest或类似帐户登录,它应与cURL的{​​{1}}类似PHP

问题是网页只允许每个帐户进行单点登录,如果我使用HttpClient签名,则会将网页浏览器踢出去。

我想知道的是,是否可以劫持webbrowser会话或获取cookies并在我的HttpClient或类似api中使用它。

我可以使用webbrowser.Cookie获取一些数据,但如何将其推送到HttpClient

这种事情是否可能,我可以拿走cookie并使用相同的会话?如果是这样,怎么样?

4 个答案:

答案 0 :(得分:15)

从这里得到帮助:

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 :(得分:4)

你可以,但这有点棘手。使用InternetSetCookie调用以及来自HttpWebRequest的CookieContainer。

以下是方法: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

答案 2 :(得分:1)

我认为你可能会把技术拉得太过分了。 Windows窗体中的webbrowser控件通常用于为您提供本地文件或Internet的基本html呈现,但不应用于替换完整的Web浏览器。

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

希望它有所帮助,

答案 3 :(得分:1)

我是这样做的

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(address);
var cookies = new CookieContainer();
cookies.SetCookies(webBrowser.Document.Url, 
                          webBrowser.Document.Cookie.Replace(';', ','));
req.CookieContainer = cookies;