编辑:
我添加了“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);
这可能吗?
答案 0 :(得分:3)
更新:在我的原始答案中,我说你不能这样做。但实际上,您可以这样做,但这是一件危险的事情,因为任何拥有有效Microsoft Graph令牌的人理论上都可以访问您的API。在我走这条路之前,让我描述一下代表最终用户访问Microsoft Graph的“正确”方式。
执行此操作的正确方法是使用移动后端代码中的代表流来交换用户的ID令牌以获取Microsoft Graph令牌。流程如下所示:
示例代码:
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);
x-ms-token-aad-id-token
请求标头)以获取图形令牌。此令牌交换称为“代表”,并记录为here。我认为这可以使用ADAL或MSAL库来完成,但我无法找到文档。它也很简单,你可以直接实现HTTP协议而不会有太多麻烦。您还可以缓存在后端获取的图形标记,以便每个API调用不需要更多的AAD API调用来进行标记交换。
答案 1 :(得分:1)
将INSERT-RESOURCE-ID-HERE替换为您的移动应用后端的客户端ID。您可以从门户网站Azure Active Directory设置下的“高级”选项卡中获取客户端ID。
访问令牌的受众群体应该是您的移动应用后端的客户端ID。因此,如果资源为https://graph.microsoft.com/(访问令牌中的aud
声明),则客户端管理的身份验证无法正常工作。