我正在使用.NET 4,并尝试通过Web浏览器控件(WPF和/或WinForms)对StackApps站点使用桌面身份验证,以开发用于访问*(https://stackapps.com/questions/4215/stackapp-nntp-bridge-for-accessing-stackexchange-forums-like-*)的NNTP桥.
似乎无法完成登录,因为在显示“ 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窗口中工作.有人知道问题出在哪里吗?
重新拒绝很简单:
>创建一个WinForms项目
>将“ WebBrowser”控件添加到对话框
>双击Form1
>添加以下代码
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");
}
>启动应用程序
>通过按“使用Stack Exchange登录”帐户符号登录
>加载新页面;它显示正确,但是您不能输入您的登录名;窗户挂着…
如果我使用WPF-App和WPF-WebBrowser-Control,也会发生同样的情况……看来它陷入了JavaScript的无限循环中……
关于如何解决这个问题的任何提示?
还是可以在WebBrowser-Control中调试JavaScript ???
解决方法:
修复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事件捕获该URL.
剩余的问题
它实际上并不能完美地工作.第一次我也被重定向到一些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模式下运行,那将是很好的选择,但是至少这似乎是一个适当的解决方法.