GetAuthCredentials не вызывается, когда требуется аутентификация - PullRequest
0 голосов
/ 06 мая 2020

У меня есть элемент управления (ECBControl), содержащий ChromiumWebBrowser

<cefSharp:ChromiumWebBrowser x:Name="_browser" Grid.Column="0" Grid.ColumnSpan="2" AllowDrop="True"
  Address="{Binding ElementName=_this, Path=Address, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
  FrameLoadStart="_browser_FrameLoadStart" FrameLoadEnd="_browser_FrameLoadEnd" 
  MouseWheel="_browser_MouseWheel"                                             
  RenderOptions.BitmapScalingMode="{Binding ElementName=_this, Path=BitmapScaling, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" PreviewKeyDown="_browser_OnPreviewKeyDown"></cefSharp:ChromiumWebBrowser>

Диалог (ECBBrowser), содержащий ECBControl, регистрирует обработчик карты

private void ECBMapDialog_Loaded(object sender, RoutedEventArgs e)
{
    this.ECBBrowser.Browser.RequestHandler = new ECBMapHandler(this);        
}

Через некоторые Javascript взаимодействия (это было рассмотрено в другом SO-вопросе CefSharp Javascript регистрация и выполнение не работают в версии 79.1.36 ), веб-сайт вызывается несколько раз для получения изображений карты

Fiddler Log

Здесь я ожидал, что GetAuthCredentials моего ECBMapHandler будет вызван

public bool GetAuthCredentials(IWebBrowser chromiumWebBrowser, IBrowser browser, string originUrl, bool isProxy, string host, int port, string realm, string scheme, IAuthCallback callback)
{
    try
    {
        if (isProxy && ECBConfiguration.Instance.ProxyAuthentication)
        {
            var userName = Core.Applications.CoreApplication.ClientCredentials.GetUserName();
            var password = Core.Applications.CoreApplication.ClientCredentials.GetPassword();

            callback.Continue(userName, password);
            return true;
        }

        if (this.Provider.Credentials.TryGetValue(host, out var credentials))
        {
            callback.Continue(credentials.GetUserName(), credentials.GetPassword());
            return true;
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }
    callback.Cancel();
    return false;
}

Но он никогда не вызывается, и в результате карта не отображается в браузере. Что мне нужно сделать, чтобы это работало?

Обновление

Я создал пример на основе решения MinimalExample. Вы можете найти его по телефону https://github.com/tbremeyer/CefSharpSample.git. Все действия для этого примера находятся в Main Windows .xaml.cs:

private async Task CallWebSite()
{
    if (_callsPerformed > _maxCalls) return;
    var executingAssembly = Assembly.GetExecutingAssembly();
    var resourcePath = "CefSharp.MinimalExample.Wpf" + ".web.index.html";

    if (executingAssembly.GetManifestResourceInfo(resourcePath) != null)
    {
        var resourceStream = executingAssembly.GetManifestResourceStream(resourcePath);
        var memoryStream = new MemoryStream();
        await resourceStream.CopyToAsync(memoryStream);
        resourceStream.Close();
        memoryStream.Position = 0;
        var fileText = await new StreamReader(memoryStream).ReadToEndAsync();
        Browser.LoadHtml(fileText, true);
    }

    var result = await Browser.EvaluateScriptAsync($"httpGet('http://httpbin.org/basic-auth/undefined/undefined?accept=json')");
    _callsPerformed++;
}

Файл html загружается из файла ресурсов и загружается в браузер. html содержит сценарий, который выполняет запрос на получение URL-адреса, переданного в качестве параметра. URL-адрес требует аутентификации, вы получаете 401 (как видно в Fiddler). Метод GetAuthCredentials в MinimalExampleHandler никогда не вызывается.

...