2013-02-24 13 views
7

私はwebbrowser controlを持っているWindowsフォームアプリケーションを作成しています。ログインするためのウェブブラウザのクッキーを取得する

ユーザーがwebbrowserでログインした後、私はMicrosoft.Http.HttpClientまたはHttpWebRequestまたは類似で同じアカウントでもログインする、それがPHPからcURLのようになります。

問題は、Webページではアカウントごとにシングルサインオンのみが許可され、HttpClientでサインするとウェブブラウザが蹴られてしまうことです。 webbrowserセッションをハイジャックやcookiesを取得し、私のHttpClientまたは類似apiでそれを使用することが可能である場合、私は、知りたい

私はwebbrowser.Cookieを使用してデータを取得できますが、それはどのようにHttpClientにプッシュするのですか?

私はちょうどクッキーを取って同じセッションを使うことができるということも可能ですか?もしそうなら、どうですか?

+0

CookieがHttpOnlyのCookieのある場合、ウェブブラウザは、それらを格納しません。 [IEGetProtectedModeCookie](https://msdn.microsoft.com/en-us/library/cc196998(v=vs.85).aspx)を参照してください。 –

答えて

12

ガットのヘルプ:

Is it possible to transfer authentication from Webbrowser to WebRequest

Alkampferは解決策を掲載しました。これはまさに私が必要としていたものです。

この解決方法には、Http onlyクッキーが必要です。

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

私はテクノロジーを少し伸ばしているかもしれないと思います。 WindowsフォームのWebブラウザコントロールは、通常、ローカルファイルやインターネットからの基本的なHTMLレンダリングを提供するように設計されていますが、本格的なWebブラウザを置き換えるためには使用しないでください。

SSOプロバイダに対して認証を行う場合は、Windows Identitity Foundationの右側のライブラリをMicrosoft.IdentityModelとともに使用する必要があります。これにより、SSOプロバイダのクレームを処理するクレーム認証メカニズムが得られます。クッキーはアプリケーション間で共有することはできません。実際には、新しいウェブテクノロジではそれを避けるように設計されているので、私の意見では、Webブラウザコントロールの代わりにWIFを使用してみてください。

ご希望の場合は、

+1

私はそのSSOプロバイダーではないと思っています。 javascriptなど、同じ時間にアカウントに2つの接続をブロックするもの。 – Jaanus

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、2番目の回答、HttpWebRequestに設定していますが、機能していません。アカウントはログインしていません。 – Jaanus

+0

HttpWebRequestのCookieContainer?このコンテナには、http要求後にCookieが含まれている必要があります。 – ThomasArdal

+0

ああ、申し訳ありませんが、すでに問題を解決したとは思われません:) – ThomasArdal

関連する問題