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

JavaScript权限被拒绝。如何允许受信任域之间的跨域脚本编写?,javascript,cross-domain,Javascript,Cross Domain,我们有一个基于.net的应用程序,由SAP enterprise portal iframes托管。 SAP门户的域是al.xx.companyname.com。.Net应用程序服务器的域是ss.xx.companyname.com 现在,当我通过企业门户打开应用程序时,我得到一个“权限被拒绝”的JavaScript错误。我在IE中启用了脚本调试,然后将visual studio调试器附加到JavaScript错误。我注意到下面的JavaScript代码抛出了这个错误来设置/重置脏标志 if(t

我们有一个基于.net的应用程序,由SAP enterprise portal iframes托管。 SAP门户的域是al.xx.companyname.com。.Net应用程序服务器的域是ss.xx.companyname.com

现在,当我通过企业门户打开应用程序时,我得到一个“权限被拒绝”的JavaScript错误。我在IE中启用了脚本调试,然后将visual studio调试器附加到JavaScript错误。我注意到下面的JavaScript代码抛出了这个错误来设置/重置脏标志

if(top.EPCM!=null)
可以理解,这个问题是由跨域脚本造成的。i、 e.ss.xx.companyname.com的应用服务器正在尝试访问域al.xx.companyname.com的企业门户的浏览器组件

但是,这种交叉脚本是一种受信任的域脚本,我想以某种方式允许这种交叉脚本。我试图设置应用服务器的主DNS后缀。通过以下方法

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)
  • 右键单击应用服务器的“我的电脑”。(顺便说一句,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)
    
    var requireddomain='al.xx.companyname.com';
    var text=document.domain//将域返回为ss.xx.companyname.com
    如果(文本!=requireddomain)
    {
    对于(i=0;i<2;i++)
    {
    dotposition=text.indexOf(“.”);
    text=text.substr(点位置+1);
    }
    document.domain=文本;
    }
    if(top.EPCM!=null)
    
    通过上面的代码,document.domain对象被设置为companyname.com,这对于企业门户和应用服务器都是通用的。 但是,如果(top.EPCM!=null),则仍会在>>行中抛出权限拒绝问题

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

    更新:

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

    • 门户域名:al.xx.companyname.com
    • 应用程序域:ss.xx.companyname.com
    我试图将document.domain属性设置为2个子级别,即companyname.com

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

    我想,document.domain的设置只有在应用程序域是门户域的子集时才起作用。i、 e

    • 门户域名:al.xx.companyname.com
    • 应用程序域:ss.al.xx.companyname.com
    在上面的例子中,我可以将应用程序域缩减为一个子级(到al.xx.companyname.com)。那么我想,它会起作用的

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


    有没有关于如何继续的建议?

    同源策略可能非常严格,甚至对于受信任的站点也不例外

    跨浏览器属性应该能够解决以下问题:

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

    document.domain=“company.com”


    我认为将两个系统设置为同一域名是不可能的。除了你的浏览器问题之外,这会导致严重的问题,你不觉得吗?请求如何知道要访问哪个系统?请发布
    SetDomain()
    的代码,我们可能会提供更多帮助。嗨,Alex,如果(top.EPCM!=null)本身,则会在>>行中抛出错误。因此,问题在于访问企业门户组件(EPCM)。@vs1984不一定:问题可能在于访问
    top
    。该页面是否也包含
    document.domain
    指令?@Pekka-是。top的可访问性也可能是一个问题。是的,页面有document.domain指令。我可以将document.domain值设置为companyname.com。但是,仍然会在-if(top.EPCM!=null)行中抛出权限拒绝错误。现在这个问题让我头晕目眩。@vs1984奇怪。他们有相同的协议,对吗?
    http://
    https://
    ,无混音?嗨;我采用document.domain方法,将域设置为companyname.com。我已经编辑了问题中的代码。然而,这个问题仍然存在。你能检查一下我是否做错了什么吗?@vs1984你需要在每一页和每一帧中设置
    document.domain
    。是这样吗?@Pekka-是的。上述代码是在每个页面中包含的一个通用JavaScript文件中实现的。@Pekka-显然我对上述语句的理解是错误的。的确,每个交互帧的document.domain对象都应设置为相同。本期并非如此。@pekka-是的。现在可以了。但我们无法更改门户的document.domain(政治原因)。我们为应用服务器设置了一个DNS别名以匹配门户链接。然后它成功了。谢谢你指出了正确的方向。