C# WPF 在不同的域中运行应用程序副本(用于单独的 cookie)

Posted

技术标签:

【中文标题】C# WPF 在不同的域中运行应用程序副本(用于单独的 cookie)【英文标题】:C # WPF Running app copies in different domains (for separate cookies) 【发布时间】:2019-03-16 20:25:11 【问题描述】:

有一个任务:有一个主 WPF 应用程序运行多个(不同数量)另一个 WPF 应用程序的副本。每个副本都包含一个组件WebBrowser,在网站http://n.site/上执行授权每个副本必须有自己的cookie区域,因为每个副本授权不同的帐户。如您所知,WebBrowser 组件对所有启动的组件都使用“一个 cookie 空间”。我读到为了划分这个“空间”,我们需要在不同的域中运行副本。

问题:如何做到这一点?

附:如果重要的话,主应用程序和副本使用相同的外部 dll。

P.S.S 我已经在 WinForms 中实现了这一点,并且在不更改域的情况下,应用程序副本的 cookie 空间是不同的。

如果有任何帮助,我将不胜感激!

【问题讨论】:

在使用旧版WebBrowser 控件的地方,cookie 容器就是 Win32 应用程序进程本身。据我所知,为同一域分离基于 cookie 的会话的唯一方法是运行多个单独的进程。请注意您是如何为 WinForms 解决这个问题的,但如果您这样做了,只需对 WPF 使用相同的方法,因为它在后台使用相同的 WebBrowser ActiveX 控件。 @noseratio 你是绝对正确的。但是可以更改 WebBrowser 的这种行为。现在我将在这里发布解决方案。 请注意,INTERNET_SUPPRESS_COOKIE_PERSIST 只会阻止 cookie 持久性。它不会阻止仅内存 cookie 在同一 EXE 进程中的所有 WebBrowser 实例之间共享。因此,如果您在 WebBrowser 的一个实例中启动会话,它将在另一个实例中可用。用 Gmail 试试吧,我敢肯定你只需要登录一次。 【参考方案1】:

我找到了解决办法! 要更改此行为,您需要使用 InternetSetOption 函数更改 WinINET 设置。为防止通过运行同一应用程序的副本来使用通用 cookie,您必须在启动每个副本时使用以下函数更改 WinINET 设置。

[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool InternetSetOption(int hInternet, int dwOption, ref int option, int dwBufferLength);

public static void SuppressCommonCookieBehaviour()

    /* http://msdn.microsoft.com/en-us/library/windows/desktop/aa385328%28v=vs.85%29.aspx

            INTERNET_OPTION_SUPPRESS_BEHAVIOR (81):
                  A general purpose option that is used to suppress behaviors on a process-wide basis. 
                  The lpBuffer parameter of the function must be a pointer to a DWORD containing the specific behavior to suppress. 
                  This option cannot be queried with InternetQueryOption. 

            INTERNET_SUPPRESS_COOKIE_PERSIST (3):
                  Suppresses the persistence of cookies, even if the server has specified them as persistent.
                  Version:  Requires Internet Explorer 8.0 or later.
    */


    int option = 3; /* INTERNET_SUPPRESS_COOKIE_PERSIST */

    bool success = InternetSetOption(0, 81 /* INTERNET_OPTION_SUPPRESS_BEHAVIOR */ , ref option, sizeof(int));

    if (!success)
        throw new InvalidOperationException("InternetSetOption() returns false");

【讨论】:

以上是关于C# WPF 在不同的域中运行应用程序副本(用于单独的 cookie)的主要内容,如果未能解决你的问题,请参考以下文章

在不同域中的 reactjs 和 spring boot 应用程序之间启用 CSRF

Facebook Auth:无法加载 URL:此 URL 的域不包含在应用程序的域中

Facebook 登录错误:无法加载 URL:此 URL 的域未包含在应用程序的域中

Facebook 登录:无法加载 URL 此 URL 的域未包含在应用程序的域中

SQL Server Management Studio 2008 Runas 用户在不同的域上通过 ***

使用 PHP SDK 登录 Facebook 应用程序不起作用:此 URL 的域不包含在应用程序的域中 [重复]