在我的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();
}
谢谢你的帮助!
答案 0 :(得分:0)
根据您的说明,我假设您可以通过浏览器直接访问您的移动应用https://{your-app-name}.azurewebsites.net/.auth/login/microsoftaccount
并使用您的MSA登录。记录后,您可以尝试访问https://{your-app-name}.azurewebsites.net/.auth/me
以检索记录的用户信息,如下所示:
然后,您可以检索access_token
并尝试通过邮递员模拟请求以缩小此问题:
然而,我接着尝试呼叫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。