Реализуйте пользовательскую обработку 401 для элемента управления WebBrowser - PullRequest
1 голос
/ 15 ноября 2011

Согласно этой статье , я расширил класс System.Windows.Forms.WebBrowser для реализации пользовательской обработки ошибок. В основном это работает.

Проблема возникает, когда браузер получает ответ «401 Unauthorized». При таком ответе элемент управления WebBrowser отображает стандартное диалоговое окно «Имя пользователя / пароль». Событие NavigateError не запускается до тех пор, пока это диалоговое окно не будет отменено.

Так, что я могу сделать, чтобы захватить ответ 401 и обработать его по-своему?

Я предполагал, что смогу что-то сделать, например, то, что я сделаю, чтобы запечатлеть событие NavigateError и справиться с этим по-своему, но я ничего не видел.

Редактировать: Решение найдено!
Важные шаги:
1. Элемент управления WebBrowser должен сначала перейти на незащищенную страницу («about: blank» - типичный используемый URL), чтобы избежать KB 320153
2. Хост для элемента управления WebBrowser должен реализовывать IOleClientSite, IServiceProvider и IAuthenticate.
3. IServiceProvider.QueryService должен обрабатывать IAuthenticate запрос на обслуживание с реализацией IAuthenticate, все остальные запросы на обслуживание могут обрабатываться с помощью ответа INET_E_DEFAULT_ACTION.
4. IAuthenticate.Authenticate - ваш пользовательский обработчик аутентификации.

Ответы [ 2 ]

3 голосов
/ 15 ноября 2011

реализовать IAuthenticate и IAuthenticateEx на вашем хосте веб-браузера .По сути, ваша реализация IOleClientSite должна ответить IServiceProvider.QueryService и вернуть интерфейс IAuthenticate (Ex) (не управляемый, а собственный, возвращенный из Marshal.GetComInterfaceForObject), когда службой является IID_IAuthenticate.Для нераспознанных запросов на обслуживание QueryService должен возвращать INET_E_DEFAULT_ACTION.

Я не думаю, что веб-браузер WPF имеет точки расширения для своей реализации IOleClientSite.Вы можете попробовать разместить класс веб-браузера Winform, который имеет переопределенный виртуальный метод CreateWebBrowserSiteBase, который предоставляет реализацию IAuthenticate (Ex), или написать оболочку веб-браузера с нуля .

Thisможет не работать в сеансе Citrix .

0 голосов
/ 07 июня 2013

Я обнаружил, что, чтобы иметь возможность перемещаться по сайту без потери или удаления заголовка авторизации, я должен был сделать следующее, в противном случае для каждой новой страницы пользователю предлагалось снова. Это решение также не требует включения синтаксиса user: password @ site.

    private bool _redirected = false;
    private const string BaseUrl = @"http://mySite";

    private void Navigate()
    {
        var helpUrl = BaseUrl;
        var authHeader = GetAuthHeader();

        _docWindow.Browser.Navigate(helpUrl, string.Empty, null, authHeader);           
        _docWindow.Browser.Navigating += Browser_Navigating;

    }

    private string GetAuthHeader()
    {
        byte[] authData = UnicodeEncoding.UTF8.GetBytes(_userName + ":" + _password);
        string authHeader = "Authorization: Basic " + Convert.ToBase64String(authData);
        return authHeader;
    }

    void Browser_Navigating(object sender, System.Windows.Navigation.NavigatingCancelEventArgs e)
    {            
        if (_redirected)
        {
            _redirected = false;
            return;
        }
        var newPage = BaseUrl + e.Uri.AbsolutePath;

        e.Cancel = true;
        _redirected = true;
        _docWindow.Browser.Navigate(newPage, string.Empty, null, GetAuthHeader());
    }
...