如何在不显示浏览器的情况下在Win Form应用程序上从IdentityServer注销

时间:2019-04-09 15:28:25

标签: c# identityserver4

我正在尝试通过OidcClient库从IdentityServer注销,但是现在的解决方案要求我有一个空对话框,该对话框在退出前会弹出5秒钟。这非常丑陋,必须有更好的方法来实现。

在用于阻止表单弹出的official example中,使用了“ BeforeNavigate2”事件,但是如果不包括某些COM导入并扩展WebBrowser控件(如here所示,则该事件不可用)我也想避免。

我已经尝试用信号灯替换ShowDialog,但是如果我等待它,则会出现死锁,因为等待线程与应该触发“ Navigated”事件的线程相同。 我还尝试用HttpClient替换浏览器的导航,但后来我失去了WebBrowser已经处理的重定向和cookie删除功能

这是我的代码:

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阻止执行,直到Web请求被完全填充而没有阻塞线程,然后使用form.Close()释放它。

理想情况下,注销时间不会超过几秒钟,并且不会弹出任何窗口。
任何帮助表示赞赏。

0 个答案:

没有答案