餅乾在Internet Explorer(或託管版本)的處理是聯繫在一起的IE自身的「URL安全區域」的概念,DOC在這裏:About URL security Zones
因此,IE決定使用施加到URL各種alogorithms的URL區域。根據區域的不同,您的託管瀏覽器可能會或可能不會支持會話或永久性Cookie。
奇怪的是,當我創建一個小型的WPF示例時,將Web瀏覽器添加到它並導航到此持久cookie測試儀使用頁面:http://www.rbaworld.com/Security/Computers/Cookies/givecook.shtml,它工作正常。每次啓動示例應用程序時,計數器都會正常遞增,因此不是每個人都可以重現您的問題。那麼,這就是URL安全區域的全部目的:它可以根據機器,用戶,Windows策略等因人而異......
接下來的問題是:我可以更改您正在運行的區域嗎?簡單而簡單的答案是......不,因爲它與安全密切相關。
如果您自己託管IE,您可以實現您自己的安全區域句柄,如下所述:Implementing a Custom Security Manager和示例:SAMPLE: Secumgr.exe Overrides Security Manager for WebBrowser Host但您依賴的WPF的webbrowser不允許任何覆蓋...您可以獲得到Reflector並複製所有的WPF私人/內部代碼,但這是一個冒險工作的日誌!
您可以嘗試的最後一件事是操縱標準的Internet Security Manager。以下是一些示例代碼,提供了一些提示。至少你應該能夠確定你正在運行的區域(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;
}
祝你好運:)
我不理解這個答案。是不是cookie綁定到頁面,而不是綁定到應用程序?這是設置Cookie的頁面。該應用程序是完全被動的。 – 2010-12-16 11:15:10
我已經更新了這個問題,希望能夠更好地說明我想在這裏實現的目標。 Cookie不是由應用程序創建的,它們都是在服務器端創建的。該應用只是顯示網頁。 – Wilka 2010-12-16 12:42:54