有一个可能看起来很奇怪的问题,但我有项目要求为阅读模式实现outlook web app(内容应用程序)的以下功能 - 更新正在查看的项目(消息或约会)的主题。 方法尝试:
1)getCallbackTokenAsync - 在服务器端获得错误,即没有足够的权限来更新EWS中的项目。
2)getUserIdentityTokenAsync - 在服务器端获取错误的权限不足以在服务器端调用ConvertId,并且在尝试在客户端或服务器端调用UdateItem时在客户端获取“Legacy Item Id格式错误。”
3)获得用户同意和令牌通过OAuth 2访问代码流 - 失败(在IE导航中由于iframe沙箱被阻止,而window.open被MS用于该应用iframe的权限)(在Chrome导航中允许,以及理论上它会起作用,但像/ api / items / {exchange item id}这样的网址会导致错误404.11(从沙箱iframe发送时检测到双重转义)。4)使用grant_type = client_credentials [具有客户端ID和客户端密码]在服务器端获取访问令牌,但结果令牌被认为是“低安全性”(保护级别1,而级别2是必需的)。已知表单错误401 Unauthorized with x-ms-diagnostics header is try to update item。
PS:只是提醒我在READ视图中尝试更新项目,而不是在编辑/撰写模式下。
感谢您的帮助!
PS:使用ADAL进行应用程序范围的证书身份验证调用,因为我看起来像这样:
public async Task<JObject> PrepareApplicationAuthenticationToken()
{
var authContext = new AuthenticationContext(
GetAuthorityUrl()
.ToString()
);
var result = await authContext.AcquireTokenAsync(
GetResourceUrl(),
new ClientAssertionCertificate(GetClientId(), AppCertificateHelper.GetCertificate())
);
var token = JSON.LoadFromString(result.Serialize());
token["access_token"] = result.AccessToken;
token["refresh_token"] = result.RefreshToken;
return token;
}
答案 0 :(得分:1)
客户端凭据流要求您使用证书而不是客户端ID /机密组合。您可以使用自签名证书,只要将其上传到您的应用注册清单即可。有关详细信息,请参阅http://blogs.msdn.com/b/exchangedev/archive/2015/01/21/building-demon-or-service-apps-with-office-365-mail-calendar-and-contacts-apis-oauth2-client-credential-flow.aspx。