Как выйти из IdentityServer в приложении Win Form без отображения браузера - PullRequest
1 голос
/ 09 апреля 2019

Я пытаюсь выйти из IdentityServer через библиотеки OidcClient, но решение, которое у меня сейчас есть, требует, чтобы у меня было пустое диалоговое окно, всплывающее на 5 секунд, прежде чем я смогу выйти из системы.Это очень уродливо, и должен быть лучший способ сделать это.

В официальном примере для предотвращения появления формы всплывающее событие используется «BeforeNavigate2», но это недоступнобез включения некоторых операций импорта COM и расширения элемента управления WebBrowser, как показано здесь , и это тоже я стараюсь избегать.

Я уже пытался заменить ShowDialog семафором, но еслиЯ жду этого, я получу тупик, потому что ожидающий поток - тот же самый, который должен вызвать событие "Navigated".Я также попытался заменить навигацию браузера на HttpClient, но затем потерял функциональность перенаправлений и удаления файлов cookie, которые WebBrowser уже обрабатывает

Это мой код:

public override Task<BrowserResult> InvokeAsync(BrowserOptions options) {
    BrowserResult result = null;
    var t = new Thread(() => result = Run());
    //needed because the browser UserControl will throw an exception if not inside a STA thread
    t.SetApartmentState(ApartmentState.STA);
    t.Start();
    t.Join();
    return System.Threading.Tasks.Task.FromResult(result);
}
private BrowserResult Run(){
    form = new Form { Name = "WebAuthentication", Text = formCaption, Width = 
    formWidth, Height = formHeight, ShowIcon = false };
    browser = new WebBrowser { Dock = DockStyle.Fill };
    form.Controls.Add(browser);
    browser.Navigated += (sender, args) => {
                         form.Close();
                       };
    browser.Navigate(options.StartUrl);
    form.ShowDialog();
    return new BrowserResult { ResultType = BrowserResultType.Success };
}

То, что я делаю здесь, - это использование ShowDialog для блокирования выполнения до тех пор, пока веб-запрос не будет полностью заполнен, блокируя поток, а затем освобождая его с помощью формы. Close ().

В идеале, при выходе из системызаймет не более пары секунд, и никакие окна не должны появляться.
Любая помощь приветствуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...