3

我正在使用 .NET 4 并尝试通过 Web 浏览器控件(WPF 和/或 WinForms)使用 StackApps 站点的桌面身份验证来开发用于访问 StackOverflow 的 NNTP 桥(https://stackapps.com/questions/4215 /stackapp-nntp-bridge-for-accessing-stackexchange-forums-like-stackoverflow)。

似乎无法登录,因为在显示“StackExchange Login”页面后,Web 浏览器挂起。我使用以下网址: https ://stackexchange.com/oauth/dialog?client_id=1736&scope=no_expiry&redirect_uri=https://stackexchange.com/oauth/login_success

它可以在普通的 IE 浏览器中工作,但不能在 WinForms 或 WPF 窗口中工作……有谁知道问题出在哪里?

重现很简单:

  1. 创建一个 WinForms 项目
  2. 将“WebBrowser”控件添加到对话框
  3. 双击 Form1
  4. 添加以下代码

    private void Form1_Load(object sender, EventArgs e)
    {
      webBrowser1.Navigate("https://stackexchange.com/oauth/dialog?client_id=1736&scope=no_expiry&redirect_uri=https://stackexchange.com/oauth/login_success");
    }
    
  5. 启动应用程序

  6. 按“使用 Stack Exchange 登录”帐户符号登录
  7. 一个新页面被加载;显示正确,但无法输入登录名;窗户挂了……

同样的情况,如果我使用 WPF-App 和 WPF-WebBrowser-Control ......它似乎陷入了 JavaScript 的无限循环......

关于如何解决这个问题的任何提示?

或者是否可以在 WebBrowser-Control 中调试 JavaScript ???

4

3 回答 3

2

修复 WebBrowser 控件

尝试登录时,我也遇到了 WebBrowser 控件处理的问题。

虽然在 IE (11) 中请求令牌有效,但我发现当我将其置于 IE 7 仿真模式时 IE 本身也会挂起。这向我表明,我之前尝试使 WebBrowser 控件使用较新版本的尝试失败了。

我找到了这篇文章Web Browser Control Specifying the IE Version,它建议对于 64 位模式下的 32 位应用程序,您需要设置不同的注册表值。

所以现在,我在注册表中添加了两个值:

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

HKEY_CURRENT_USER\Software\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION

在它们中,我添加了一个名为“MyExecutable.exe”的 DWORD 值(其中 MyExecutable 是我的可执行文件的实际名称)。它们每个的值都是 9000,适用于 IE9 及更高版本。使用 RegEdit 进行测试时要小心,它将默认为十六进制而不是十进制。此外,请确保它是 DWORD 值,而不是任何其他类型。

这似乎可以解决问题。我现在可以运行应用程序,完成登录过程,最终我被重定向到我指定的 url,然后我可以使用 webbrowser 控件的 OnNavigate 事件来捕获它。

剩下的问题

它实际上并不完美。我第一次也被重定向到某个 OpenID 页面,但至少表单没有挂起。通过随后的尝试,显然会记住登录(之前成功),并且我收到消息“导航到网页已取消”,并带有刷新页面的链接。当我单击该链接时,我会立即重定向到我在请求登录表单时指定的 redirect_url。至少那部分有效,我得到了一个实际的 access_token 和一个到期时间,所以现在我很高兴。

更新:经过一番测试,原来之前的登录被记住了。这会导致请求 uri 立即定向到 redirect_uri。我使用 OnBeforeNavigate 事件来检测这一点,但在这种情况下它不会被触发。我现在链接了 NavigateComplete2 事件,并且在这种情况下触发了该事件。

修复.NET?

我认为对于 .NET,解决方案应该是相同的:将可执行文件(以及 MyExecutabl.vshost.exe 以及用于 Visual Studio 中的调试目的)添加到第一个键。如果它是在 62 位 Windows 上运行的 32 位可执行文件,您可能还需要将其添加到第二个键,尽管我确定该规则是否也适用于 .NET。我不是每天都做 C#,我试图让它首先在 Delphi 中工作,但是如果我有时间在 C# 中测试它,我会在这里发布更新。

最后,如果实际问题能够得到解决,并且 JavaScript 也可以在 IE7 模式下工作,那就太好了,但至少这似乎是一个适当的解决方法。

于 2014-12-20T23:02:24.813 回答
1
于 2014-12-20T20:14:33.007 回答
0

项目+属性,调试选项卡,勾选“启用本机代码调试”选项。确保您已启用 Microsoft 符号服务器(工具 + 选项、调试、符号),我知道您这样做了 :)

您现在可以使用 Debug + Break All 并查看浏览器内部发生了什么。反复这样做以获得土地的布局。您会看到 Javascript 正在执行 (jscript8.dll) 并不断强制布局引擎重新计算布局,但从未完成工作。

一般来说,浏览器容易受到陷入无限循环的 Javascript 的攻击。常规浏览器倾向于在几十秒后弹出一个对话框以允许用户中止 JS,但 WebBrowser 没有该功能。它也没有开发工具,所以调试 JS 也不会是一件大喜事。这将很难解决。

您可以考虑改用 OAuth 2.0 api。使用说明在此网页上。究竟如何将它与 WebBrowser 集成对我来说有点模糊,我没有测试这个的密钥。在Stackapps 站点上查找帮助。您可能不是第一个遇到此问题的 SE api 用户。

于 2013-07-27T13:28:49.497 回答