2010-11-25 85 views
2

我正在使用WPF WebBrowser在應用程序內顯示聯機幫助(只是幾個小網頁)。其中一些頁面使用cookie來顯示項目僅在頁面被查看的前幾次(這是「爲什麼不嘗試X」類型的東西)。WPF WebBrowser控件中的持久cookie?

但是,由於某些原因,Cookie似乎並未在WebBrowser控件內部工作。它們可以在IE瀏覽器以及Firefox和Chrome瀏覽器中正常工作(因此項目可以正確隱藏),但在通過WPF WebBrowser控件查看時,它們永遠不會隱藏。

在WPF WebBrowser控件中使用cookie有什麼特別之處嗎?它似乎表現得好像所有的cookies只存儲在內存中,而不是保存在磁盤上。

這裏有一個瀏覽器中的網頁(其中Cookie的工作)之一:

Help pane inside a browser

而這裏的內部應用程序完全相同的網頁:

Help pane inside the application

這額外的內容應該只在使用該軟件的前幾次才能看到(即它應該在該網頁的N次瀏覽後隱藏),但是因爲我無法讓Cookie工作,所以它始終可見。

回答

6

餅乾在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; 
} 

祝你好運:)

0

默認情況下,WebBrowser控件不允許使用此功能。出於安全原因,您可能不希望來自不同開發人員/公司的不同應用程序能夠訪問其他應用程序創建的Cookie信息。

然而,看看這個答案How to delete Cookies from windows.form?

,涉及到通過JavaScript刪除Cookie,但你可以以堅持和創建站點的cookie每個應用程序被加載時使用類似的方法。

+0

我不理解這個答案。是不是cookie綁定到頁面,而不是綁定到應用程序?這是設置Cookie的頁面。該應用程序是完全被動的。 – 2010-12-16 11:15:10

+0

我已經更新了這個問題,希望能夠更好地說明我想在這裏實現的目標。 Cookie不是由應用程序創建的,它們都是在服務器端創建的。該應用只是顯示網頁。 – Wilka 2010-12-16 12:42:54