Single sign on Microsoft Edge上的SSO不起作用,但在IE11、Chrome、Safari和Firefox上起作用-通过Office.js加载项

Single sign on Microsoft Edge上的SSO不起作用,但在IE11、Chrome、Safari和Firefox上起作用-通过Office.js加载项,single-sign-on,office-js,microsoft-edge,Single Sign On,Office Js,Microsoft Edge,my Office.js addin应用程序中的以下oAuth2 SSO代码在IE11、Chrome、Safari和Firefox中运行良好,但在Microsoft Edge中不起作用。我可以看到承载令牌通过url返回到弹出对话框: 我还可以看到asyncResult.status==成功,即 [对象对象]:{状态:“成功”,值:对象} 状态:“成功” 值:对象 addEventHandler:function(){var d=OSF.DDA.SyncMethodCalls[OSF.DDA.S

my Office.js addin应用程序中的以下oAuth2 SSO代码在IE11、Chrome、Safari和Firefox中运行良好,但在Microsoft Edge中不起作用。我可以看到承载令牌通过url返回到弹出对话框:

我还可以看到asyncResult.status==成功,即

[对象对象]:{状态:“成功”,值:对象} 状态:“成功”

值:对象

addEventHandler:function(){var d=OSF.DDA.SyncMethodCalls[OSF.DDA.SyncMethodNames.AddMessageHandler.id],c=d.verifyAndExtractCall(参数,a,b),e=c[Microsoft.Office.WebExtension.Parameters.EventType],f=c[Microsoft.Office.WebExtension.Parameters.Handler];返回b.addEventHandler和FireQueuedEvent(e,f)} 参数:null 呼叫方:空 长度:0 名称:“价值”

原型:对象

proto:function(){[本机代码]}

关闭:函数(){var c=OSF.\u OfficeAppFactory.getHostFacade()[OSF.DDA.DispIdHost.Methods.CloseDialog];c(参数,g,b,a)}

sendMessage:function(){var c=OSF.\u OfficeAppFactory.getHostFacade()[OSF.DDA.DispIdHost.Methods.sendMessage];返回c(参数,b,a)}

原型:对象

原型:对象

但是,当Microsoft Edge运行侧边栏/加载项时,不会调用“console.log('hello');”

弹出对话框在F12调试控制台中显示:

HTTP403:禁止-服务器理解请求,但拒绝满足请求。 (XHR)职位-

有什么想法吗

export function loginUsingOAuth() {
    try {
        const sealUrl = getFromStorage('seal_url', STORAGE_TYPE.LOCAL_STORAGE);
        const redirectUrl = `${window.location.protocol}//${window.location.host}/login`;

        let displayInIframe = false;
        let promptBeforeOpen = false;

        if (typeof sealUrl !== 'undefined' && sealUrl) {
            const oAuthUrl = `${sealUrl}/seal-ws/oauth2/login?redirect_uri=${redirectUrl}`;

            Office.context.ui.displayDialogAsync(
                oAuthUrl,
                {
                    height: 80,
                    width: 80,
                    displayInIframe,
                    promptBeforeOpen
                },
                asyncResult => {
                    console.log('asyncResult');
                    console.log(asyncResult);
                    addLog(LOG_TYPE.INFO, 'authentication.loginUsingOAuth', asyncResult);
                    if (asyncResult.status !== 'failed') {
                        const dialog = asyncResult.value;

                        dialog.addEventHandler(Office.EventType.DialogMessageReceived, args => {
                            console.log('hello');
在Edge中执行时,这可能实际上是一个路由问题?“/login”回调被路由到AuthCallback.js组件:


const Routes = () => (
    <BrowserRouter>
        <Switch>
            <Route exact path="/login" component={AuthCallback} />
            <Route path="/" component={BaseLayout} />
        </Switch>
    </BrowserRouter>
);
我开始怀疑Edge是否在干扰重定向。在下图中,您可以看到IE和Edge为同一登录操作返回不同的状态代码:


边缘浏览器似乎有两个问题

  • 在Microsoft Edge上运行displayInIframe=false时,重定向/回调没有调用组件构造函数。所有其他浏览器都按预期工作。我已经添加了条件逻辑来为边缘浏览器用例设置displayinframe=true

  • 当displayInIframe=true时,messageParent方法也不适用于边缘浏览器。因此,我不得不在弹出对话框回调中提取auth令牌,并将其隐藏在本地存储中。然后,父级(侧栏)轮询本地存储,以检测登录是否已完成。同样,Chrome、Firefox、Safari、IE11(Mac和PC)都很好——只是边缘浏览器出了问题

  • 虽然这是一个丑陋的问题解决方案,但它也不完美,因为如果最终用户尚未登录到SSO,则会显示Google[Account Selector]对话框,这在DisplayInFrame=true时是一个问题,因为这会引发iframe异常


    我看不到任何其他选项对我们开放,因为O/S版本号和MSWord版本决定了使用哪个浏览器来呈现侧边栏。如果Edge没有这些功能缺陷,则无法选择使用IE11还是Edge是可以接受的。

    Edge浏览器似乎有两个问题

  • 在Microsoft Edge上运行displayInIframe=false时,重定向/回调没有调用组件构造函数。所有其他浏览器都按预期工作。我已经添加了条件逻辑来为边缘浏览器用例设置displayinframe=true

  • 当displayInIframe=true时,messageParent方法也不适用于边缘浏览器。因此,我不得不在弹出对话框回调中提取auth令牌,并将其隐藏在本地存储中。然后,父级(侧栏)轮询本地存储,以检测登录是否已完成。同样,Chrome、Firefox、Safari、IE11(Mac和PC)都很好——只是边缘浏览器出了问题

  • 虽然这是一个丑陋的问题解决方案,但它也不完美,因为如果最终用户尚未登录到SSO,则会显示Google[Account Selector]对话框,这在DisplayInFrame=true时是一个问题,因为这会引发iframe异常


    我看不到任何其他选项对我们开放,因为O/S版本号和MSWord版本决定了使用哪个浏览器来呈现侧边栏。如果Edge没有这些功能缺陷,那么无法选择使用IE11还是Edge是可以忍受的。

    不要发布文本截图。只要复制粘贴文本,并适当缩进,如果它粘贴没有适当的缩进。此外,您的代码看起来没有完成,但最重要的是:在控制台日志设置为不过滤任何内容的情况下,您在Edge中看到了哪些错误或警告?据我所知,您的对话框正在调用
    messageParent
    ,而这在Edge上失败。您能否澄清是什么事件触发了您看到的403?HTTP 403禁止客户端错误状态响应代码表示服务器理解该请求,但拒绝对其进行授权。此状态类似于401,但在本例中,重新身份验证不会产生任何影响。访问被永久禁止,并与应用程序逻辑相关联,例如对资源的权限不足。尝试降低internet选项中的安全设置,然后再次尝试检查问题。让我们知道您正在使用哪个版本的Edge进行此测试?Ref:代码正在调用后端服务器,该服务器反过来执行SSO登录。弹出对话框将打开,其中包含启动该过程的身份验证url。在本例中,此验证url包含回调url。后端服务器执行身份验证,并将此指定的回调url与访问令牌一起作为参数调用,例如,为了进一步简化用例,可将问题总结如下:当Microsoft Edge执行代码时,不会触发以下事件:
        constructor(props) {
            super(props);
            const paramsObj = queryString.parse(props.location.search);
            const paramsStr = JSON.stringify(paramsObj);
            setTimeout(() => {
                Office.context.ui.messageParent(paramsStr);
            }, 1200);
        }