使用Microsoft Graph令牌验证App Services后端?

时间:2017-05-26 14:30:24

标签: azure azure-mobile-services microsoft-graph adal

编辑:

我添加了“id_token”,但仍然收到“未经授权”的回复。 这是我的登录代码:

PublicClientApplication myApp = new PublicClientApplication("My-AppID-From-App-Registration-Portal");
string[] scopes = new string[] { "User.Read" };
AuthenticationResult authenticationResult = await myApp.AcquireTokenAsync(scopes).ConfigureAwait(false);

JObject payload = new JObject();
payload["access_token"] = authenticationResult.AccessToken;
payload["id_token"] = authenticationResult.IdToken;

user = await MobileService.LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount, payload);

原帖:

是否可以使用从Microsoft Graph检索到的令牌对App Services后端进行身份验证? 我已经尝试使用此令牌并使用AzureActiveDirectory作为提供程序调用LoginAsync(),但这不起作用。

JObject payload = new JObject();
payload["access_token"] = GraphAuthenticationHelper.TokenForUser;
user = await MobileService.LoginAsync(MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, payload);

这可能吗?

2 个答案:

答案 0 :(得分:3)

更新:在我的原始答案中,我说你不能这样做。但实际上,您可以这样做,但这是一件危险的事情,因为任何拥有有效Microsoft Graph令牌的人理论上都可以访问您的API。在我走这条路之前,让我描述一下代表最终用户访问Microsoft Graph的“正确”方式。

执行此操作的正确方法是使用移动后端代码中的代表流来交换用户的ID令牌以获取Microsoft Graph令牌。流程如下所示:

  1. 客户端使用MSAL使用AAD启动登录,并将资源设置为移动后端(而不是图形)。结果应该是一组令牌。
  2. 客户端使用移动SDK通过access_token和来自#1的id_token进行登录。
  3. 示例代码:

    JObject payload = new JObject();
    payload["access_token"] = {access_token.from.msal};
    payload["id_token"] = {id_token.from.msal};
    var user = await MobileService.LoginAsync(
        MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory,
        payload);
    
    1. 后端代码交换用户的ID令牌(来自x-ms-token-aad-id-token请求标头)以获取图形令牌。此令牌交换称为“代表”,并记录为here。我认为这可以使用ADAL或MSAL库来完成,但我无法找到文档。它也很简单,你可以直接实现HTTP协议而不会有太多麻烦。
    2. 后端使用新获取的MS Graph令牌并进行图谱API调用。
    3. 您还可以缓存在后端获取的图形标记,以便每个API调用不需要更多的AAD API调用来进行标记交换。

答案 1 :(得分:1)

我认为不,请参阅文件:https://docs.microsoft.com/en-us/azure/app-service-mobile/app-service-mobile-dotnet-how-to-use-client-library#a-nameauthenticationaauthenticate-users

  
    

将INSERT-RESOURCE-ID-HERE替换为您的移动应用后端的客户端ID。您可以从门户网站Azure Active Directory设置下的“高级”选项卡中获取客户端ID。

  

访问令牌的受众群体应该是您的移动应用后端的客户端ID。因此,如果资源为https://graph.microsoft.com/(访问令牌中的aud声明),则客户端管理的身份验证无法正常工作。