3

Twitter API を使用する WPF アプリケーションを開発しています。Twitter 認証ページを表示するには、WPF Web ブラウザー コントロールを使用しています。ログインして Twitter API を正常に使用できます。私の問題は、ログアウト機能を実装するために Web ブラウザーの Cookie をクリアする必要があることです。WPF Web ブラウザーでセッション Cookie をクリアする方法はありますか?

4

3 に答える 3

6

昨日この問題に遭遇し、今日ようやく完全な解決策を思いつきました. 答えはここに記載されており、ここここで詳しく説明されています。

ここでの主な問題は、WebBrowser(WPF および WinForms の) では、既存のセッション Cookie を変更 (削除) できないことです。これらのセッション Cookie は、マルチユーザーのシングル デバイス エクスペリエンスの成功を妨げています。

上記のリンクの StackOverflow 応答では、重要な部分が省略されていMarshalます。サービスを使用する代わりに、安全でないコード ブロックを使用する必要があります。以下は、セッション Cookie の永続性を抑制するためにプロジェクトに配置できる完全なソリューションです。

public static partial class NativeMethods
{
    [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength);

    private const int INTERNET_OPTION_SUPPRESS_BEHAVIOR = 81;
    private const int INTERNET_SUPPRESS_COOKIE_PERSIST = 3;

    public static void SuppressCookiePersistence()
    {
        var lpBuffer = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(int)));
        Marshal.StructureToPtr(INTERNET_SUPPRESS_COOKIE_PERSIST, lpBuffer, true);

        InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SUPPRESS_BEHAVIOR, lpBuffer, sizeof(int));

        Marshal.FreeCoTaskMem(lpBuffer);
    }
}
于 2015-01-08T21:35:10.483 に答える
3

以下を確認してください。

http://social.msdn.microsoft.com/Forums/en/wpf/thread/860d1b66-23c2-4a64-875b-1cac869a5e5d

private static void _DeleteSingleCookie(string name, Uri url)
    {
        try
        {
            // Calculate "one day ago"
            DateTime expiration = DateTime.UtcNow - TimeSpan.FromDays(1);
            // Format the cookie as seen on FB.com.  Path and domain name are important factors here.
            string cookie = String.Format("{0}=; expires={1}; path=/; domain=.facebook.com", name, expiration.ToString("R"));
            // Set a single value from this cookie (doesnt work if you try to do all at once, for some reason)
            Application.SetCookie(url, cookie);
        }
        catch (Exception exc)
        {
            Assert.Fail(exc + " seen deleting a cookie.  If this is reasonable, add it to the list.");
        }
    }
于 2012-05-30T08:29:11.773 に答える
0

私はこれをテストしていませんが、Cookie をクリアする Javascript メソッドを (可能であれば) ページに定義するのが最善の方法だと思います。

document.cookie='c_user=;expires=Thu, 01 Jan 1970 00:00:00 GMT;domain=.facebook.com';

(またはCookie名が何であれ)。次に、 WebBrowserコントロールでInvokeScriptメソッドを使用できます。

于 2012-05-30T06:22:18.330 に答える