10

我正在创建一个 Windows 窗体应用程序,其中有一个webbrowser control.

用户使用 登录后webbrowser,我也想使用相同或类似的帐户登录Microsoft.Http.HttpClientHttpWebRequest它应该类似于cURLfrom PHP

问题是该网页只允许每个帐户单点登录,如果我使用 HttpClient 登录,它将退出网络浏览器。

我想知道的是,是否有可能劫持webbrowser会话或获取cookies并在我的HttpClient或类似api的 .

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

这种事情甚至可能吗,我可以只拿 cookie 并使用相同的会话吗?如果是这样,怎么做?

4

4 回答 4

18

从这里得到帮助:

是否可以将身份验证从 Webbrowser 转移到 WebRequest

Alkampfer 发布了解决方案。这正是我所需要的,并且奏效了。

此解决方案还需要Http onlycookie。

您可以调用 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;
}
于 2013-02-24T14:25:20.703 回答
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

于 2013-02-24T08:46:15.180 回答
1

我认为您可能将技术延伸得太远了。Windows 窗体中的 webbrowser 控件通常旨在为您提供本地文件或 Internet 的基本 html 呈现,但不应使用它来替换成熟的 web 浏览器。

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

希望能帮助到你,

于 2013-02-24T08:23:40.150 回答
1

我这样做

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(address);
var cookies = new CookieContainer();
cookies.SetCookies(webBrowser.Document.Url, 
                          webBrowser.Document.Cookie.Replace(';', ','));
req.CookieContainer = cookies;
于 2018-03-15T21:14:10.053 回答