WPF WebBrowser 控件中的持久 cookie?

2023-12-03

我正在使用 WPF WebBrowser 在应用程序内显示在线帮助(只是一些小网页)。其中一些页面使用 cookie 仅在页面被查看的前几次显示项目(这是“为什么不尝试 X”类型的事情)。

但是,由于某种原因,cookie 似乎无法在 WebBrowser 控件内工作。它们在完整的 IE 以及 Firefox 和 Chrome 中工作良好(因此项目正确隐藏),但在通过 WPF WebBrowser 控件查看时它们从不隐藏。

在 WPF WebBrowser 控件中使用 cookie 有什么特别之处吗?看起来好像所有 cookie 都只存储在内存中,而不是持久保存在磁盘上。

这是浏览器内的其中一个页面(cookie 在此工作):

Help pane inside a browser

这是应用程序内完全相同的页面:

Help pane inside the application

该附加内容仅应在使用该软件的前几次可见(即,在该网页的 N 次查看后应隐藏),但因为我无法让 cookie 工作,所以它始终可见。


Internet Explorer(或托管版本)中的 Cookie 处理与 IE 自己的“URL 安全区域”概念相关,文档如下:关于 URL 安全区域

因此,IE 使用应用于 url 的各种算法来确定 url 区域。根据区域的不同,您的托管浏览器可能支持也可能不支持会话或持久 cookie。

奇怪的是,当我创建一个小型 WPF 示例时,向其中添加 Web 浏览器并导航到此持久 cookie 测试器实用程序页面:http://www.rbaworld.com/Security/Computers/Cookies/givecook.shtml,效果很好。每次我启动示例应用程序时,计数器都会很好地递增,因此并非每个人都可以重现您的问题。嗯,这就是 URL 安全区域的全部目的:它可能因计算机、用户、Windows 策略等而异......

下一个问题是:我可以更改您正在运行的区域吗?简短而简单的答案是……不,因为它与安全性密切相关。

如果您自己托管 IE,则可以实现自己的安全区域句柄,如下所述:实施自定义安全管理器和这里的一个示例:示例:Secumgr.exe 覆盖 WebBrowser 主机的安全管理器但您依赖于 WPF 的网络浏览器,不允许任何覆盖...您可以访问 Reflector 并复制所有 WPF 私有/内部代码,但这是危险工作的日志!

您可以尝试的最后一件事是操纵标准的互联网安全管理器。这是一些给出一些提示的示例代码。至少您应该能够确定您正在运行的区域 (MapUrltoZone) 并更改 cookie (TryAllowCookie)。标准管理器的问题是大多数时候,它会向最终用户弹出允许授权的对话框......(再次安全!):

[ComImport, Guid("7b8a2d94-0ac9-11d1-896c-00c04Fb6bfc4")]
private class InternetSecurityManager
{
}

[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("79eac9ee-baf9-11ce-8c82-00aa004ba90b")]
private interface IInternetSecurityManager
{
    void Unused1();
    void Unused2();
    [PreserveSig]
    int MapUrlToZone([In, MarshalAs(UnmanagedType.BStr)] string pwszUrl, out int pdwZone, [In] int dwFlags);
    void Unused3();
    [PreserveSig]
    int ProcessUrlAction(string pwszUrl, int dwAction, ref int pPolicy, int cbPolicy, ref Guid pContext, int cbContext, int dwFlags, int dwReserved);
    // left undefined
}

public static SecurityZone MapUrlToZone(Uri uri)
{
    IInternetSecurityManager securityManager = (IInternetSecurityManager)new InternetSecurityManager();
    int zoneId;
    if (securityManager.MapUrlToZone(uri.ToString(), out zoneId, 0) < 0)
        return SecurityZone.NoZone;

    return (SecurityZone)zoneId;
}

private const int URLACTION_COOKIES = 0x00001A02;
private const int URLACTION_COOKIES_ENABLED = 0x00001A10;
private const int URLPOLICY_ALLOW = 0x00;
private const int URLPOLICY_DISALLOW = 0x03;
private const int PUAF_DEFAULT = 0x00000000;

public static bool TryAllowCookies(Uri uri)
{
    IInternetSecurityManager securityManager = (IInternetSecurityManager)new InternetSecurityManager();
    int policy = 0;
    Guid context = Guid.Empty;
    int hr = securityManager.ProcessUrlAction(uri.ToString(), URLACTION_COOKIES_ENABLED, ref policy, Marshal.SizeOf(policy), ref context, Marshal.SizeOf(context), PUAF_DEFAULT, 0);
    return (hr == 0) && policy == URLPOLICY_ALLOW;
}

祝你好运 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF WebBrowser 控件中的持久 cookie? 的相关文章

随机推荐

  • 初始化未知大小的二维数组

    我有一个二维字符数组 例如char aList numStrings maxLength 理想情况下 在程序执行期间 我希望能够修改 aList 的内容 即添加 修改或删除条目 由于 aList 可能会发生更改 因此我不想在每次更改后都必须
  • Android Smack 消息事件监听器

    我正在尝试使用 XMPP 的消息事件接口 据我了解 您可以在发送的消息上标记 请求送达通知 标志 然后收件人负责向您发送此通知 有人成功实施过这个吗 有人可以给我发送一些示例代码吗 我的代码不起作用 我的侦听器 MessageEventNo
  • Android 应用程序,文档中根元素后面的标记必须格式正确

    我已经开始从下面的链接模块 6 1 项目开始处理一些 Android 教程演示http www vogella de articles Android article html 对于下面的 menu xml 中的菜单标签 我在 Eclips
  • NSLinguisticTagger enumerateTagsInRange 不适用于具有 NSLinguisticTagSchemeNameTypeOrLexicalClass 的设备

    这是我正在使用的代码 无论我在设备上使用什么句子 它都不会打印任何内容 在模拟器上运行得很好 NSMutableArray getTagEntries NSString sentence NSArray
  • C# 字符串到浮点转换无效?

    var x dr NationalTotal ToString 给我 333333333 var xxx Convert ToSingle dr NationalTotal ToString 给我 333333344 有什么想法吗 发生这种
  • Firefox 插件忽略 iframe

    我正在尝试为 LinkedIn 构建一个插件 但内容脚本会在每一帧中输出 我的 main js exports main function var pageMod require page mod pageMod PageMod inclu
  • 使用 afterFeature 钩子调用时动态场景冻结

    当我使用 afterFeature 挂钩调用功能文件进行测试清理时 出现奇怪的行为 清理功能文件被正确调用 因为我可以看到文件背景部分的打印 但由于某种原因 场景大纲的执行挂起 我尝试使用 Junit5 运行程序运行功能 并在 Intell
  • TOMCAT - HTTP 状态 404 [重复]

    这个问题在这里已经有答案了 我在 eclipse 中设置了我的服务器 当我运行它时 控制台打印 mai 02 2013 4 05 13 PM org apache catalina core AprLifecycleListener ini
  • 无法使用角度材料显示角度 2 中垫表中的选定行

    我使用带选择框的角度材料在角度 2 中实现了一个简单的表格 当我选择所需的行并单击 传输所选行 时 这些行将被拼接 并且拼接的行将显示在我的控制台中 但我无法在输出窗口中显示它们 请通过链接访问样本示例 我想在我的输出屏幕上显示控制台输出
  • 如何设置 try-catch 以确保用户输入枚举列表中包含的值?

    我有一个星期几的枚举列表 以及一个要求用户输入当前日期的程序 可以是列表中的任何一天 我需要实现一个 try catch 以确保用户输入有效的日期 但我遇到了一些困惑 当我搜索如何使用枚举执行异常时 大多数网站建议使用 TryParse 而
  • 如何验证 Codeigniter 中组合的多个字段?

    有没有一种创造性且简单的方法可以同时检查多个表单字段 我有一个带有动态生成字段的表单 每个字段都有一个唯一的 ID 问题是提交时不需要填写所有字段 但在提交之前至少必须填写一个字段 有没有办法在 Codeigniter 中做到这一点 或者我
  • 不存在 ID 为 *id* 的消息

    我正在尝试列出通过 mandrill API 发送的电子邮件 我可以通过打电话列出它们https mandrillapp com api 1 0 messages search json 这给了我一个列表 其中包含一堆已发送的消息以及一个
  • 保留通用变量之间的类型限制

    假设我们有一些类有一个重要的泛型变量T另一个类有两个字段 一个包含 一个不包含 class Wrapper
  • C++ 调用非默认构造函数作为成员[重复]

    这个问题在这里已经有答案了 假设我有一个类 A 和一个类 B B 用作 A 中的成员 B 没有默认构造函数 但需要参数 class B B int i class A B m B A m B 17 this gives an error 我
  • 当应该使用 String 时,groupingBy 将键的对象返回为 Map

    假设我有一个品牌对象列表 POJO 包含返回字符串的 getName 我想建立一个Map
  • R 记录脚本的显示名称

    这是我当前问题的一个原子示例 目前我有一个包含多个 R 脚本的项目 全部位于名为 DIR 的同一目录中 我在 DIR 中有一个主脚本 它获取所有 R 文件 并包含一个基本配置 basicConfig 我在 DIR 中使用了两个脚本 dog
  • C++:重复执行 do while 循环

    我对这个超级新手问题感到非常抱歉 但我一生都无法理解如何重复 do while 循环 我将 while 循环更改为 do while 循环 现在我不知道如何让它询问 您想重复 Y 还是 N 有什么解释吗 我读过各种完成 do while 循
  • 如何使用 jQuery 访问多维 JSON 数组中的值

    因此 我使用 getJSON 获取多维 JSON 数组 并且想要访问数组中的值 但无法访问比数组中第一个元素更长的值 producers producer id 1 name Em u00e5mejeriet address Grenv u
  • 异步承诺返回函数的同步与异步执行

    当制作返回承诺的异步函数时 在每个实现中我都看到了这种做法 function asyncFunction return new Promise resolve reject gt the function code if condition
  • WPF WebBrowser 控件中的持久 cookie?

    我正在使用 WPF WebBrowser 在应用程序内显示在线帮助 只是一些小网页 其中一些页面使用 cookie 仅在页面被查看的前几次显示项目 这是 为什么不尝试 X 类型的事情 但是 由于某种原因 cookie 似乎无法在 WebBr