Web services 我的Office加载项中的Javascript位于哪个域

Web services 我的Office加载项中的Javascript位于哪个域,web-services,office-js,office-addins,outlook-web-addins,Web Services,Office Js,Office Addins,Outlook Web Addins,我们有一个在OWA中运行的Outlook加载项 舱单在 Javascript位于 我们在内部编写的自定义Web服务位于 当我从JavaScript内部调用以响应外接程序命令时,我使用ajax调用中的格式 我最终得到了一个CORS错误(有时是飞行前的,有时是CORB)。如果Javascript实际上与web服务位于同一个域上,为什么会出现这种情况 我假设我已经通过身份验证,因为我已经登录了Outlook帐户 有什么好处 注: 作为一个实验,我尝试通过直接键入URL(不涉及OWA)进行RESTf

我们有一个在OWA中运行的Outlook加载项

  • 舱单在
  • Javascript位于
  • 我们在内部编写的自定义Web服务位于
当我从JavaScript内部调用以响应外接程序命令时,我使用ajax调用中的格式

我最终得到了一个CORS错误(有时是飞行前的,有时是CORB)。如果Javascript实际上与web服务位于同一个域上,为什么会出现这种情况

我假设我已经通过身份验证,因为我已经登录了Outlook帐户

有什么好处

注: 作为一个实验,我尝试通过直接键入URL(不涉及OWA)进行RESTful调用。这导致代码针对Azure AD进行身份验证。然后,我在同一浏览器会话中登录OWA,一切正常。即使我调用的Web服务在同一个域中,我是否真的需要在Javascript中进行身份验证

产生错误的AJAX调用 记住,在我通过直接从浏览器调用我的web服务进行RESTful调用之后,它就可以正常工作了

    var apiUri = '/api/People/ShowRecord';


$.ajax({
    url: apiUri,
    type: 'POST',
    data: JSON.stringify(serviceRequest),
    contentType: 'application/json; charset=utf-8',
    dataType: 'json'
}).done(function (response) {
    if (!response.isError) {
        // response to successful call
    }
    else {
        // ... 
    }
}).fail(function (status) {
    // some other response
}).always(function () {

    console.log("Completed");
});
观察 当我从地址栏调用api时,下面的代码将运行。Javascript永远不会调用此代码

[assembly: OwinStartup(typeof(EEWService.AuthStartup))]

namespace EEWService
{
    public partial class AuthStartup
    {
        public void Configuration(IAppBuilder app)
        { app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
        app.UseCookieAuthentication(new CookieAuthenticationOptions());

        app.UseWsFederationAuthentication(
            new WsFederationAuthenticationOptions
            {

                Notifications = new WsFederationAuthenticationNotifications
                {
                    RedirectToIdentityProvider = (context) =>
                    {
                        context.ProtocolMessage.Whr = "ourdomain.com";
                        return Task.FromResult(0);
                    }
                },

                MetadataAddress = ConfigurationManager.AppSettings["ida:MetadataAddress"],
                Wtrealm = ConfigurationManager.AppSettings["ida:Audience"],

                TokenValidationParameters = new TokenValidationParameters
                {
                    ValidAudiences = new string[] { $"spn:{ConfigurationManager.AppSettings["ida:Audience"]}" }
                }
            });


        app.UseWindowsAzureActiveDirectoryBearerAuthentication(
            new WindowsAzureActiveDirectoryBearerAuthenticationOptions
            {
                Tenant = ConfigurationManager.AppSettings["ida:Tenant"],
                TokenValidationParameters = new TokenValidationParameters
                {
                    ValidAudience = ConfigurationManager.AppSettings["ida:Audience"]
                },
                MetadataAddress = ConfigurationManager.AppSettings["ida:MetadataAddress"],
            });

    }
}

}我认为这有一些问题

第一个问题是,您正试图从为代码提供服务的同一台服务器上提供静态内容。这通常被认为是一种不好的做法,纯粹是因为没有必要为静态内容浪费这些宝贵的服务器资源。理想情况下,您应该将静态内容上载到CDN,并让用户的浏览器向某个超级缓存文件服务器发出请求。但是-我知道您目前可能无法使用此选项。这也不是根本原因

第二个也是真正的问题是,(你认为你是,但是)你没有被认证。Outlook web加载项中的身份验证在默认情况下不会出现,这是您需要处理的事情。当Outlook将web加载项加载到侧面板中时,它会使某些方法对您可用,您可以使用这些方法并在某种程度上创建一个伪身份(例如)-但是如果您想要真正的身份验证,您需要自己进行验证

据我所知,有三种方法可以做到这一点

  • 第一个是通过
  • 第二个是通过
  • 第三个——我认为是逻辑上实现起来最方便、最简单的一个——是使用WebSocket。(可能是你需要的)。
    • 当用户加载你的第一页时,确保像
      window.Unique\u ID
      这样的JS值对他们可用。这会派上用场的
    • 在用户界面中有一个按钮,上面写着“验证”
    • 当用户单击此按钮时,您将它们弹出到一个url,该url将重定向到您的身份验证url。(差不多)。这将避免您在侧面板中被阻止的麻烦,因为您正在使用
      窗口。请使用域中的url打开
      。将唯一的_ID传递给重定向,然后重定向到OAuth登录URL。看起来应该是
      https://login.microsoftonline.com/......&state=Unique_ID
    • 在弹出“用户登录”窗口后,在主JS(客户端)中,打开服务器的web套接字,再次使用该唯一的\u ID并开始侦听
    • 当用户完成身份验证时,OAuth流应该发回访问令牌或代码。如果您获得了访问令牌,您可以通过套接字将其发送到前端(使用post back参数中的唯一_ID),或者如果您有代码,您可以通过服务器到服务器调用完成对用户的身份验证,然后以相同的方式传递访问令牌。因此,您可以使用该唯一Id跟踪用户连接的套接字,并将访问令牌仅中继到该用户

  • 我认为这有一些问题

    第一个问题是,您正试图从为代码提供服务的同一台服务器上提供静态内容。这通常被认为是一种不好的做法,纯粹是因为没有必要为静态内容浪费这些宝贵的服务器资源。理想情况下,您应该将静态内容上载到CDN,并让用户的浏览器向某个超级缓存文件服务器发出请求。但是-我知道您目前可能无法使用此选项。这也不是根本原因

    第二个也是真正的问题是,(你认为你是,但是)你没有被认证。Outlook web加载项中的身份验证在默认情况下不会出现,这是您需要处理的事情。当Outlook将web加载项加载到侧面板中时,它会使某些方法对您可用,您可以使用这些方法并在某种程度上创建一个伪身份(例如)-但是如果您想要真正的身份验证,您需要自己进行验证

    据我所知,有三种方法可以做到这一点

  • 第一个是通过
  • 第二个是通过
  • 第三个——我认为是逻辑上实现起来最方便、最简单的一个——是使用WebSocket。(可能是你需要的)。
    • 当用户加载你的第一页时,确保像
      window.Unique\u ID
      这样的JS值对他们可用。这会派上用场的
    • 在用户界面中有一个按钮,上面写着“验证”
    • 当用户单击此按钮时,您将它们弹出到一个url,该url将重定向到您的身份验证url。(差不多)。这将避免您在侧面板中被阻止的麻烦,因为您正在使用
      窗口。请使用域中的url打开
      。将唯一的_ID传递给重定向,然后重定向到OAuth登录URL。看起来应该是
      https://login.microsoftonline.com/......&state=Unique_ID
    • 在将用户弹出到