Outlook API使用Office.context.mailbox.getUserIdentityTokenAsync(callback, userContext);
(https://msdn.microsoft.com/en-us/library/office/fp142236.aspx)返回“身份标记”。我正在尝试从base-64 URL编码的字符串中获取JSON。
到目前为止,我已尝试过此网址的代码示例:https://msdn.microsoft.com/en-us/library/f7f4813a-3b2d-47bb-bf93-71b64620a56b
使用Javascript:
Office.context.mailbox.getUserIdentityTokenAsync(function (data) {
$.ajax({
type: "POST",
url: "/api/exchange/createAndValidateIdentityToken",
contentType: 'application/json',
data: JSON.stringify({ userIdentityToken: data.value })
})
.done(function (data) {
console.log(data);
})
.fail(function (data) {
console.log(data);
});
});
C#:
[HttpPost]
public AppIdentityToken CreateAndValidateIdentityToken(JObject data)
{
JToken userIdentityToken = data.GetValue("userIdentityToken");
string rawToken = userIdentityToken.Value<string>();
try
{
AppIdentityToken token = (AppIdentityToken)AuthToken.Parse(rawToken);
token.Validate(new Uri("https://**url**/ews/exchange.asmx"));
return token;
}
catch (TokenValidationException ex)
{
throw new ApplicationException("A client identity token validation error occurred.", ex);
}
}
AuthToken.Parse
返回AppIdentityToken
个例外,我不明白为什么:
注1:错误部分是法语:“levéuneexception de type”=“引发了类型”的异常。
注2:解码后的身份令牌格式:https://msdn.microsoft.com/en-us/library/fp179838.aspx
答案 0 :(得分:3)
经过一整天的搜索,我终于找到了解决方案。以下是导致我找到解决方案的来源:
此链接表示如果是InvalidTokenAudienceException
:
包含传递给Validate()的URL时抛出的异常 AppIdentityToken对象的方法与受众群体不匹配 客户端标识令牌中指定的参数。 (https://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.auth.validation(v=exchg.80).aspx)
在JSON身份令牌中,有一个aud
属性,它接受.html文件,并且:
令牌仅在从正在运行的加载项发送时才有效 客户的浏览器。 如果加载项使用Office加载项清单 schema v1.1,此URL是第一个SourceLocation中指定的URL 元素,在表单类型ItemRead或ItemEdit 下 (https://msdn.microsoft.com/en-us/library/fp179838.aspx)
以下代码适用于我:
[HttpPost]
public AppIdentityToken CreateAndValidateIdentityToken(JObject data)
{
JToken userIdentityToken = data.GetValue("userIdentityToken");
string rawToken = userIdentityToken.Value<string>();
try
{
AppIdentityToken token = (AppIdentityToken)AuthToken.Parse(rawToken);
token.Validate(new Uri("https://localhost:44300/AppRead/Home/Home.html"));
return token;
}
catch (TokenValidationException ex)
{
throw new ApplicationException("A client identity token validation error occurred.", ex);
}
}