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;
}
祝你好运 :)