我们有一个在OWA中运行的Outlook加载项。
当我在JavaScript中响应加载项命令进行调用时,我在ajax调用中使用格式https://company.ourdomain.com/api/Controller/Action。
我最终得到了一个CORS错误(有时它是在飞行前,其他时候是CORB)。如果Javascript与Web服务位于同一个域中,为什么我会这样做?
我假设自从我登录Outlook帐户后我已通过身份验证。
是什么赋予了?
注意:作为实验,我通过直接键入URL(不涉及OWA)尝试RESTful调用。这导致代码针对Azure AD进行身份验证。然后我在同一个浏览器会话中登录OWA,一切正常。即使我正在呼叫的Web服务在同一个域中,我是否真的需要在Javascript中进行身份验证?
生成错误的AJAX CALL请记住,通过直接从浏览器调用我的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-addins中的身份验证默认情况下不会出现,这是您需要处理的事情。当Outlook将您的Web加载项加载到侧面板时,它会使您可以使用某些方法,并且可以创建一个伪标识(例如Office.context.mailbox.userProfile.emailAddress
) - 但如果您想要真正的身份验证,则需要自己动手
据我所知,有三种方法可以做到这一点。
window.Unique_ID
这样的JS值。这将派上用场。
在UI中有一个按钮 - 显示“Authenticate”
当用户单击此按钮时,您将其弹出到一个URL,该URL将重定向到您的身份验证URL。 (像https://company.ourdomain.com/redirToAuth这样的东西)。这样可以省去在侧面板中被阻止的麻烦,因为你正在使用window.open
和你网域上的网址。将该Unique_ID传递给重定向,然后重定向到OAuth登录URL。这看起来应该像https://login.microsoftonline.com/......&state=Unique_ID
在弹出用户登录窗口之后,在主JS(客户端)中,您打开一个Web服务器,再次使用该Unique_ID并开始监听。
当用户完成身份验证时,OAuth流应回发访问令牌或代码。如果您获得了访问令牌,您可以通过套接字将其发送到前端(使用回传参数中的Unique_ID),或者如果您有代码,则使用服务器到用户完成对用户的身份验证服务器调用并以后以相同的方式传递访问令牌。因此,您使用该唯一ID来跟踪用户连接的套接字,并仅将访问令牌中继到该用户。