如何在JSON中获取Exchange身份令牌?

时间:2015-10-05 13:03:40

标签: c# asp.net office365 outlook-addin exchangewebservices

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个例外,我不明白为什么:

Error IdentityToken

注1:错误部分是法语:“levéuneexception de type”=“引发了类型”的异常。

注2:解码后的身份令牌格式:https://msdn.microsoft.com/en-us/library/fp179838.aspx

1 个答案:

答案 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);
        }

    }