使用UserAssertion获取访问令牌会出错:验证凭据时出错

时间:2015-11-19 12:21:34

标签: c# oauth office365 azure-active-directory office-addins

我目前正在开发Outlook应用程序。我有一个Javascript加载项项目和一个MVC Web API项目。我尝试将加载项中的令牌发送到API,并从所述令牌获取新令牌以访问Sharepoint和Exchange。

目前我收到以下错误:

  

AADSTS70002:验证凭据时出错。 AADSTS50013:断言受众群体声明与所需值不符。

以下是我从Javascript加载项获取令牌的方法:

//GET NEW ACCESS TOKEN
var _mailBox = Office.context.mailbox;
_mailbox.getUserIdentityTokenAsync(function (result) {
    var token = result.value;

    var item = _mailbox.item;

    //The initial ajax to the Web API
    $.ajax({
        type: 'POST',
        url: "https://192.168.0.150:30303/api/api/uploadfile";
        data: JSON.stringify({
            'MailId': item.itemId,
            'SpListguid': guid //GUID of the Sharepoint list we wish to upload this email to
        }),
        headers: {
             'Authorization': 'Bearer ' + token,
        },
        contentType: 'application/json'
    }).done(function () {
        console.log("Successfully hit the service");
    }).error(function (err) {
        console.log("Something went wrong! Oh boi!");
        console.log(err);
    })
})

以下是我在MVC Web API中处理令牌的方法:

[EnableCors(origins: "*", headers"Origin, Content-Type, Authorization, Accept", methods: "GET, POST, OPTIONS")]
public class APIController : ApiController
{

    [HttpPost]
    public IHttpActionTResult UploadFile(){
        using(ClientContext clientcontext = SharePointHelper.GeClientContextWithAccessToken(this.ControllerContext))
        {
            //Do something once done 
        }
    }   
}

此处使用SharePointHelper方法的课程GetClientContextWithAccessToken(HttpControllerContext)

public class SharepointHelper
{

    public static Clientcontext GetclientcontextwithAccessToken(HttpControllercontext controlerContext)
    {
        string tenantId = {my-tenant-id};
        string authority = string.format("https://login.windows.net/{0}", tenantId);
        string resource = {the-app-id-uri-from-my-addin-in-azure}; //example could be "https://sharepointcommunity.com/outlookaddin"
        AuthenticationContext authContext = new AuthenticationContext(authority)

        var authResult = AcquireUserAssertionAccessToken(controllerContext, authContext, resource)
    }

    private static AuthenticationResult AcquireUserAssertionAccessToken(HttpControllercontext controllercontext, AuthenticationCotnext authContext, string resource)
    {
        var rawToken = controllerContext.Request.Headers.GetValues("Authorization").First();
        string userAccessToken = token.Substring(token.LastIndexOf(' ')).Trim(); //To remove the "Bearer"
        var cc = new ClientCredentials({my-client-id}, {my-client-secret});
        var ua = new UserAssertion(userAccessToken);
        var result = authContext.AcquireToken(resource, cc, ua);
    }
}

最后一行是发生错误的地方(var result = ...)。

我不确定是否会因为JavaScript加载项中的身份令牌错误或其他错误而发生这种情况。

注意: AAD中的JavaScript加载项具有AAD中MVC Web API的权限。 MCV Web API具有Exchange和SharePoint的权限。

1 个答案:

答案 0 :(得分:2)

前提是我不知道办公室人员在他们的包装方法中做了什么。

  1. 您应该在服务器端请求的资源不是您的 插件,但共享点或交换。让API请求令牌 对于前端没有任何我能想到的目的。如果 你解决了这个问题,但仍然无效。

  2. 尝试使用

  3. 构建UserAssertion
    string userName = ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn) != null ? ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn).Value : ClaimsPrincipal.Current.FindFirst(ClaimTypes.Email).Value;
    UserAssertion userAssertion = new UserAssertion(userAccessToken, "urn:ietf:params:oauth:grant-type:jwt-bearer", userName);