【发布时间】: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 后缀。按照下面的方法。
- 右击应用服务器的我的电脑。 (顺便说一下,Windows 2003 服务器)
- 选择属性 - 计算机名称
- 单击更改按钮,然后在下一个窗口中单击更多按钮
- 在“这台计算机的主要 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://,没有混音?