Я пытаюсь выйти из 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 ().
В идеале, при выходе из системызаймет не более пары секунд, и никакие окна не должны появляться.
Любая помощь приветствуется.