【问题标题】:JavaScript permission denied. How to allow cross domain scripting between trusted domains?JavaScript 权限被拒绝。如何允许受信任域之间的跨域脚本?
【发布时间】:2021-06-16 18:15:54
【问题描述】:

我们有一个使用 SAP 企业门户 iframe 托管的基于 .net 的应用程序。 SAP 门户的域是 al.xx.companyname.com。 .Net 应用服务器的域是 ss.xx.companyname.com

现在,当我通过企业门户打开应用程序时,我收到“权限被拒绝”JavaScript 错误。我在 IE 中启用了脚本调试,然后将 Visual Studio 调试器附加到 JavaScript 错误。我注意到以下 JavaScript 代码会引发错误以设置/重置脏标志。

if(top.EPCM!=null)

可以理解,该问题是由跨域脚本引起的。即 ss.xx.companyname.com 的应用服务器正在尝试访问域 al.xx.companyname.com 的企业门户的浏览器组件。

但是,这种交叉脚本是受信任的域脚本,我想以某种方式允许这种交叉脚本。我尝试设置应用程序服务器的主 DNS 后缀。按照下面的方法。

  1. 右击应用服务器的我的电脑。 (顺便说一下,Windows 2003 服务器)
  2. 选择属性 - 计算机名称
  3. 单击更改按钮,然后在下一个窗口中单击更多按钮
  4. 在“这台计算机的主要 DNS 后缀”文本框下,我输入了值 - al.xx.companyname.com。

现在经过上述设置,我假设企业门户和应用服务器的域都将被视为 al.xx.companyname.com。但是,我仍然在上面提到的相同 JavaScript 代码中收到 JavaScript 权限被拒绝错误。

按照回复中的建议,我还实现了 document.domain 方法。

var requireddomain = 'al.xx.companyname.com';
var text = document.domain; //returns the domain as ss.xx.companyname.com

if (text != requireddomain) 
        {
            for (i=0; i < 2; i++)
            {
                dotposition = text.indexOf( "." );
                text = text.substr(dotposition +1);
            }
            document.domain = text;
         }

    if(top.EPCM!=null)

使用上面的代码,document.domain 对象被设置为companyname.com,这对于企业门户和应用服务器都是通用的。 但是,仍然在行中引发了权限被拒绝问题 >> if(top.EPCM!=null)

过去 3 天,这个问题让我头疼。有人可以帮我吗? 目标是允许应用程序服务器和企业门户之间的跨域脚本,这是一个受信任的连接。谢谢。

更新:

有趣而令人沮丧的发展。我已经在我的应用程序服务器中安装了 ssl 证书。仍然会抛出权限被拒绝错误。

  • 门户域:al.xx.companyname.com
  • 应用域名:ss.xx.companyname.com

我试图将 document.domain 属性设置为 2 个子级别,即 companyname.com。

但仍然出现“权限被拒绝错误”。

我想,document.domain 的设置只有在应用域是门户域的子集时才有效。即

  • 门户域:al.xx.companyname.com
  • 应用域名:ss.al.xx.companyname.com。

在上述情况下,我可以将应用程序域降低到一个子级别(到 al.xx.companyname.com)。那么我想,它会起作用的。

但是在我的例子中,门户和应用服务器是同一个 companyname.com 的 2 个分支子域,因此仍然不允许跨脚本。

对如何进行有什么建议吗?

【问题讨论】:

  • 我认为将两个系统设置为同一个域名是不可能的。除了浏览器问题之外,这还会导致严重的问题,你不觉得吗?请求如何知道要访问哪个系统?请张贴SetDomain() 的代码,我们可能会提供更多帮助。
  • 嗨,Alex,错误是在 >>if(top.EPCM!=null) 行中抛出的。所以问题在于访问企业门户组件 (EPCM)。
  • @vs1984 不一定:问题可能是访问top。该页面是否还包含document.domain 指令?
  • @Pekka - 是的。顶部的可访问性也可能是问题所在。是的,该页面有 document.domain 指令。我能够将 document.domain 值设置为 companyname.com。但是,仍然会在该行中引发权限被拒绝错误 - if(top.EPCM!=null)。这个问题现在让我头疼..
  • @vs1984 奇怪。他们确实有相同的协议,对吧? http://https://,没有混音?

标签: javascript cross-domain


【解决方案1】:

同源政策可能非常严格,即使是受信任的网站也不例外。

跨浏览器document.domain属性应该可以解决这个问题:

同源规则有一个例外。脚本可以将 document.domain 的值设置为当前域的后缀。如果这样做,则较短的域将用于后续的来源检查。例如,假设http://store.company.com/dir/other.html 文档中的脚本执行以下语句:

document.domain = "company.com";

【讨论】:

  • 嗨;我遵循了将域设置为 companyname.com 的 document.domain 方法。我已经编辑了问题中的代码。但是问题仍然存在。你能检查我是否做错了什么吗?
  • @vs1984 你需要在每个页面和每个框架中设置document.domain。是这样吗?
  • @Pekka - 是的。上述代码是在每个页面中包含的通用 JavaScript 文件中实现的。
  • @Pekka - 显然我对上述陈述是错误的。确实,对于每个交互的框架,document.domain 对象都应该设置为相同的。本期并非如此。
  • @pekka - 是的。现在可以了。我们无法更改门户的 document.domain(政治原因)。我们为应用服务器设置了一个 DNS 别名,以匹配门户链接。然后它起作用了。感谢您指出正确的方向。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 2016-09-24
  • 1970-01-01
  • 2013-02-09
  • 2017-05-18
  • 2014-06-18
  • 2015-11-15
相关资源
最近更新 更多