JavaScript权限被拒绝。如何在受信任域之间允许跨域脚本?

时间:2010-07-04 14:43:37

标签: javascript cross-domain

我们有一个基于.net的应用程序,托管有SAP企业门户网站iframe。 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。
  5. 现在,在上述设置之后,我假设企业门户和应用服务器的域都将被视为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 ,这对于企业门户和应用程序服务器都是通用的。 但是,行&gt;&gt;中仍然会出现权限被拒绝的问题。如果(top.EPCM!= NULL)

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

    更新:

    有趣&amp;令人沮丧的发展我在应用服务器中安装了ssl证书。仍然会被拒绝许可错误。

    • 门户网站域名:al.xx.companyname.com
    • app域名:ss.xx.companyname.com

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

    但仍然会发生'允许拒绝错误'。

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

    • 门户网站:al.xx.companyname.com
    • App域名:ss.al.xx.companyname.com。

    在上面的例子中,我可以将app域减少到一个子级(到al.xx.companyname.com)。然后我猜,它会起作用。

    但是在我的情况下,门户网站和应用服务器是同一companyname.com的2个分支子域,因此仍然不允许交叉脚本。

    有关如何进行的任何建议?

1 个答案:

答案 0 :(得分:7)

同源策略可能非常严格,即使对于受信任的站点也不会产生异常。

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

  

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

     

document.domain =“company.com”;