c# - 带有 Google 两步验证的 WebBrowser 控件
问题描述
我们有一个使用 .NETWebBrowser
控件来授权访问第三方 API 的类库,可以使用该第三方的 oAuth2 授权流程或使用 Google 两步验证(又名 2 因素/多因素身份验证等) .
第一个流程工作正常;系统会提示用户输入他们的电子邮件和密码,然后单击确认。没有问题。
然而,一旦用户确认(通过他们的移动设备),第二个流程就会终止。控件中的弹出网页WebBrowser
不会移动到已验证的页面,它只是坐在那里,就好像在等待用户验证一样。
我们的代码为事件实现了一个事件处理程序,WebBrowserDocumentCompleted
并且每当页面更新时都会按预期触发。但是,在用户通过他们的设备确认后,它不会触发。
我已经在网络上进行了相当不错的搜索,并且 SO 以获取有关正在发生的事情的提示,我也看过WebView2
,CefSharp
但后者需要一个额外的 C++ 库,我不想捆绑或不必担心在花了几个小时试图让一个基本的演示工作(并且失败)之后,前者处于一个非常新的开发状态。
因此,如果可能的话,我想制定一个继续使用WebBrowser
控件的解决方案。
注意:我已经检查了正在使用的版本,它是 11 基于Version
属性。我正在针对 .NET 4.5.2 的 Windows 10 Pro 机器上使用 VS 2019 进行开发(以获得最大的向后兼容性)。
解决方案
嗯,解决方案实际上是按照其他一些帖子的思路,尤其是这个。
线索是 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 配置单元,不应该需要任何提升的权限。而且我看到其他应用程序已经添加了关键条目,例如Outlook、SourceTree和Zoom。
推荐阅读
- continuous-integration - Gitlab CI/CD 在计划的管道上仅触发 gitlab-ci.yml 文件中的单个阶段
- python - Geopandas如何移动情节
- php - 分页时将锚点添加到第 2 页的第 1 页上一个链接
- node.js - 更新嵌套对象数组中的名称
- forms - UI5:验证整个表单的空值/空白值的必填和可见字段
- node.js - Nodejs 云函数 - 并非所有代码路径都返回值
- list - 使用列表在购物车中创建项目列表(Flutter Web)
- python - A 返回地图中树的数量
- sql - 执行 CREATE TABLE SQL 命令时未创建 Wordpress 表
- ruby-on-rails - Mysql2::Error:Rails 5升级后字段'key'没有默认值