10

Windowsフォームアプリを作成しています。ここに。がありwebbrowser controlます。

ユーザーがでログインした後、またはまたは同様のwebbrowserアカウントでログインしたいのですが、 fromと同様である必要があります。Microsoft.Http.HttpClientHttpWebRequestcURLPHP

問題は、Webページでアカウントごとにシングルサインオンしか許可されておらず、HttpClientでサインオンすると、Webブラウザが起動することです。

私が知りたいのは、webbrowserセッションをハイジャックしたり、取得cookiesして自分のHttpClientまたは同様ので使用したりできるかどうかapiです。

いくつかのデータを取得するために使用できますwebbrowser.Cookieが、どのようにプッシュするのHttpClientですか?

クッキーを取得して同じセッションを使用できるということも可能ですか?もしそうなら、どのように?

4

4 に答える 4

18

ここから助けを得ました:

認証を Webbrowser から WebRequest に転送することは可能ですか?

Alkampfer がソリューションを投稿しました。これはまさに私が必要としていたものであり、うまくいきました。

このソリューションはHttp onlyCookie も受け取ります。

WebRequest オブジェクトを使用した後続の呼び出しに使用できる CookieContainer を返す GetUriCookieContainer メソッドを呼び出すことができます。

[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 コントロールは通常、ローカル ファイルまたはインターネットから基本的な html レンダリングを提供するように設計されていますが、本格的な web ブラウザーを置き換えるために使用するべきではありません。

SSO プロバイダーに対して認証する場合は、適切なライブラリを使用する必要があります。この場合は、Microsoft.IdentityModel を使用して、Windows Identity Foundation から、SSO プロバイダーからのクレームを処理するためのクレーム認証メカニズムを取得します。アプリケーション間で Cookie を共有することはできません。実際、一部の新しい Web テクノロジはそれを回避するためだけに設計されているため、Web ブラウザー コントロールの代わりに WIF を使用するようにしてください。

それが役に立てば幸い、

于 2013-02-24T08:23:40.150 に答える