窗口.opener为空,父窗口无法访问自己的弹出窗口,或JavaScript运行时错误0x800706b5 (faceb

window.opener is null, parent window cannot access its own popup, or JavaScript runtime error 0x800706b5 (facebook, twitter login or paypal payments)

本文关键字:窗口 JavaScript 运行时错误 0x800706b5 faceb 自己的 为空 opener 访问      更新时间:2023-09-26

在这个问题上花了很多时间之后,我想让任何遇到同样问题的人都能找到解决方案。

常用场景

  • 你想实现外部认证与提供商,如Twitter, Facebook,微软,GitHub,或任何其他支持OAuth的网站;或
  • 你想实现外部支付的供应商,如Braintree, Paypal等
  • 你已经使用了一个服务器端OAuth库,例如带有NuGet包的Owin来支持Twitter和Facebook,就像在使用New Project向导生成的ASP.net项目中一样。你也可以使用其他库,或者在另一个MVC生态系统中开发,如Ruby或Node.js/React。
  • 您希望打开一个窗口来执行身份验证,并在验证成功或失败时关闭该窗口,而不是将用户暂时重定向出您的站点。由于您的站点是单页应用程序,重定向整个视图会破坏用户体验。
  • 您正在从本地主机测试所有这些,通过让您的运行操作打开localhost:port。此外,您正在使用IE或Edge作为浏览器。

你连接"Login with XXX"按钮来执行JavaScript,打开一个新窗口,向外部登录控制器发送一个GET请求,然后发送一个302重定向到外部登录提供商的OAuth端点,并附上OAuth信息("挑战"步骤)。

此时,尝试从父窗口访问弹出窗口将抛出JS错误0x800706b5(对象已被处置或不再可用)。这是可以的,因为窗口不再属于我们,直到它重定向回我们的网站。我们用try/catch和eat异常来处理这种极端情况,直到它再次可用为止。

用户授权你的应用程序(POST到外部提供商),提供商重定向回你的网站。或者,提供者检测到用户已经登录&批准了这个应用程序,所以它会重定向回你的网站。无论哪种情况。弹出窗口返回到您的区域,其中一个控制器处理了GET。

在弹出窗口中的页面不能访问它的打开器,因为它现在是空的。如果你尝试了一个变通的方法,而不是让它的父存储一个引用,并不断检查try块内的引用,在弹出URI返回到你的域后,引用不会变得有效。如果您将您的站点上传到服务器,这将工作,引用将成为有效的,允许父检查由子设置的窗口变量(如requestingClose),并调用close()来关闭子。

解决方案已经由Alex Altotsky在这个线程中提供:

下面是需要明确的步骤,使您的站点在IE/Edge中运行在本地主机上,能够在重定向后访问其弹出框:

  • 进入Internet选项>安全
  • 选择可信站点图标(区域)
  • 将安全级别更改为与Internet区域的安全级别完全相同的设置(默认为中高)
  • 确保启用保护模式与Internet区域相同(默认选中)。
  • <
  • 点击网站/gh>
  • 添加http://localhost
  • 取消勾选需要服务器验证
  • 关闭站点对话框
  • 点击应用到Internet选项对话框