Постоянные файлы cookie в элементе управления WPF WebBrowser? - PullRequest
2 голосов
/ 25 ноября 2010

Я использую веб-браузер WPF для отображения онлайн-справки внутри приложения (всего несколько небольших веб-страниц). Некоторые из этих страниц используют файлы cookie для отображения элементов только в первые несколько раз, когда страницы просматриваются (это тип «почему бы не попробовать X»).

Однако по какой-то причине файлы cookie не работают внутри элемента управления WebBrowser. Они отлично работают в полнофункциональном IE, а также в Firefox и Chrome (поэтому элементы правильно скрываются), но никогда не скрываются при просмотре через элемент управления WPF WebBrowser.

Есть ли что-то особенное в использовании файлов cookie в элементе управления WPF WebBrowser? Кажется, он ведет себя так, как будто все куки хранятся только в памяти, а не сохраняются на диске.

Вот одна из тех страниц в браузере (где работают куки):

Help pane inside a browser

А вот та же страница внутри приложения:

Help pane inside the application

Этот дополнительный контент должен быть виден только в первые несколько раз использования программного обеспечения (то есть он должен быть скрыт после N просмотров этой веб-страницы), но поскольку я не могу заставить cookie работать, он всегда виден. *

Ответы [ 2 ]

6 голосов
/ 20 декабря 2010

Обработка файлов cookie в Internet Explorer (или в размещенных версиях) связана с собственным представлением IE "Зоны безопасности URL", документ здесь: О зонах безопасности URL

Итак, IE определяетURL-зона с использованием различных алгоритмов, примененных к URL-адресу.В зависимости от зоны ваш размещенный браузер может поддерживать или не поддерживать сеансовые или постоянные файлы cookie.

Странно, когда я создаю небольшой пример WPF, добавляю в него веб-браузер и перехожу на эту страницу постоянного тестера файлов cookie.: http://www.rbaworld.com/Security/Computers/Cookies/givecook.shtml, работает нормально.Каждый раз, когда я запускаю пример приложения, счетчик увеличивается, поэтому не все могут воспроизвести вашу проблему.В этом вся суть зон безопасности URL: она может варьироваться в зависимости от компьютера, пользователя, политики Windows и т. Д.

Следующий вопрос: могу ли я изменить зону, в которой вы работаете?Краткий и простой ответ ... нет, потому что он тесно связан с безопасностью.

Если бы вы сами размещали IE, вы могли бы реализовать собственный дескриптор зоны безопасности, как описано здесь: Реализация пользовательской безопасностиДиспетчер и пример здесь: ОБРАЗЕЦ: Secumgr.exe переопределяет диспетчер безопасности для хоста веб-браузера , но вы полагаетесь на веб-браузер WPF, который не допускает переопределения ... Вы можете перейти в Reflector и скопироватьвесь частный / внутренний код WPF, но это журнал рискованной работы!

Последнее, что вы можете попробовать, - это манипулировать стандартным Internet Security Manager.Вот пример кода, который дает некоторые советы.По крайней мере, вы должны быть в состоянии определить зону, в которой вы работаете (MapUrltoZone), и изменить куки (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 голосов
/ 16 декабря 2010

Элемент управления WebBrowser не позволяет этого по умолчанию. По соображениям безопасности вы, вероятно, не захотите, чтобы разные приложения от разных разработчиков / компаний имели доступ к информации cookie, созданной другим приложением.

Однако, проверьте этот ответ Как удалить Cookies из windows.form?

Это относится к удалению файлов cookie через javascript, но вы можете использовать аналогичный метод для сохранения и создания файла cookie сайта при каждой загрузке приложения.

...