首页 > 解决方案 > 带有 Google 两步验证的 WebBrowser 控件

问题描述

我们有一个使用 .NETWebBrowser控件来授权访问第三方 API 的类库,可以使用该第三方的 oAuth2 授权流程或使用 Google 两步验证(又名 2 因素/多因素身份验证等) .

第一个流程工作正常;系统会提示用户输入他们的电子邮件和密码,然后单击确认。没有问题。

然而,一旦用户确认(通过他们的移动设备),第二个流程就会终止。控件中的弹出网页WebBrowser不会移动到已验证的页面,它只是坐在那里,就好像在等待用户验证一样。

我们的代码为事件实现了一个事件处理程序,WebBrowserDocumentCompleted并且每当页面更新时都会按预期触发。但是,在用户通过他们的设备确认后,它不会触发。

我已经在网络上进行了相当不错的搜索,并且 SO 以获取有关正在发生的事情的提示,我也看过WebView2CefSharp但后者需要一个额外的 C++ 库,我不想捆绑或不必担心在花了几个小时试图让一个基本的演示工作(并且失败)之后,前者处于一个非常新的开发状态。

因此,如果可能的话,我想制定一个继续使用WebBrowser控件的解决方案。

注意:我已经检查了正在使用的版本,它是 11 基于Version属性。我正在针对 .NET 4.5.2 的 Windows 10 Pro 机器上使用 VS 2019 进行开发(以获得最大的向后兼容性)。

标签: c#.netclass-library

解决方案


嗯,解决方案实际上是按照其他一些帖子的思路,尤其是这个

线索是 2SV 在我机器上的常驻 IE 浏览器中运行良好。

最后,我将上面链接中发布的代码的修改版本添加到我的静态初始化代码中:

private static void SetWebBrowserCompatibilityMode()
{
    uint iMode = 11001; // Default to Edge/IE11
    using (WebBrowser oBrowser = new WebBrowser())
    {
        switch (oBrowser.Version.Major)
        {
            case 10:
                iMode = 10001;
                break;
            case 9:
                iMode = 9999;
                break;
            case 8:
                iMode = 8888;
                break;
        }
    }
    using (RegistryKey oKey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", true))
    {
        oKey.SetValue(Path.GetFileName(Application.ExecutablePath), iMode, RegistryValueKind.DWord);
        oKey.Close();
    }
}

这并不理想,因为它需要更改注册表,但作为 CURRENT_USER 配置单元,不应该需要任何提升的权限。而且我看到其他应用程序已经添加了关键条目,例如OutlookSourceTreeZoom


推荐阅读