通过Azure内置的应用服务身份验证获取的令牌的Microsoft Graph无效的身份验证令牌错误

时间:2017-11-17 21:59:37

标签: azure-mobile-services microsoft-graph

在我的Azure移动应用程序的后端,当用户通过Microsoft帐户登录我的应用程序时,我使用Azure的内置身份验证服务来获取访问令牌。我成功获得了这个令牌。

然而,我接着尝试呼叫Microsoft Graph以获取经过身份验证的用户的姓名,电子邮件和ID。 Azure的日志流向我显示此错误:

MicrosoftGraphServiceException: 
  Code: InvalidAuthenticationToken 
  Message: CompactToken parsing failed with error code: 8004920A

以下是适用的代码:

[MobileAppController]
public class MicrosoftAccountController : ApiController
{
    MicrosoftAccountCredentials credentials;

    // GET api/<controller>
    public async Task<DataObjects.User> Get()
    {

    if (credentials == null)
    {
         credentials =  
           await this.User.GetAppServiceIdentityAsync<MicrosoftAccountCredentials>(this.Request);
        var accessToken = credentials.AccessToken; 
    }


    GraphServiceClient graphClient =
    new Microsoft.Graph.GraphServiceClient(new DelegateAuthenticationProvider((requestMessage) =>
    {
        requestMessage.Headers.Authorization =
        new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accessToken);
        return Task.FromResult(0);
    }));

    Microsoft.Graph.User graphuser = await graphClient.Me.Request().GetAsync();

}

谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

根据您的说明,我假设您可以通过浏览器直接访问您的移动应用https://{your-app-name}.azurewebsites.net/.auth/login/microsoftaccount并使用您的MSA登录。记录后,您可以尝试访问https://{your-app-name}.azurewebsites.net/.auth/me以检索记录的用户信息,如下所示:

enter image description here

然后,您可以检索access_token并尝试通过邮递员模拟请求以缩小此问题:

enter image description here

  

然而,我接着尝试呼叫Microsoft Graph以获取经过身份验证的用户的姓名,电子邮件和ID。

我假设您在用户登录后可以在移动客户端中调用await App.MobileService.InvokeApiAsync("/.auth/me", HttpMethod.Get, null);来检索用户信息。我发现您创建了一个自定义WebAPI并根据当前请求提取了令牌,并使用图形客户端检索用户信息,我没有检查您的代码,但您可以remote debugging您的移动应用程序进行故障排除代码。

此外,您可以关注App Service Token Store以获取有关App Service身份验证/授权的更多详细信息。

<强>更新

  

然而,我接着尝试呼叫Microsoft Graph以获取经过身份验证的用户的姓名,电子邮件和ID。 Azure的日志流向我显示此错误

我检查了您的代码,发现Microsoft Graph的目标位于graph.microsoft.com,而MSA登录App Service Authentication / Authorization则使用了Live SDK。并且the Live SDK已弃用,我没有找到任何用于使用Rest API的客户端SDK,我假设您可以自己创建WebRequest并访问Live SDK REST API