使用GraphAPI的AAD令牌无法访问我自己的Rest API?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用GraphAPI的AAD令牌无法访问我自己的Rest API?相关的知识,希望对你有一定的参考价值。

我必须更改我的代码才能获得一个有效的令牌,这将允许我使用Graph API访问AAD用户的详细个人资料信息

然而令我沮丧的是,最终意识到这个令牌不允许访问我的API,这也是在AAD后面的Azure上托管的?

有没有一种方法允许两者?

注意问题在于资源I在标题中传递 - 它可以是我的API,也可以是Graph,但我肯定不能要求用户登录两次?

什么是解决方案,然后一旦Graph Token用于登录就嵌入客户端密码..?

代码示例使用Microsoft.IdentityModel.Clients.ActiveDirectory

示例1 - 这将返回一个可用于我的API而非Graph的令牌

authContext = new AuthenticationContext(authority);

PlatformParameters p = new PlatformParameters(PromptBehavior.Auto, hwnd);

AuthenticationResult result = null;

result = await authContext.AcquireTokenAsync(todoListResourceId, clientId, redirectURI, p);

Resource = https://[mywebsite].azurewebsites.net/api/Timekeeper

示例2 - 这给了我一个可用于GraphAPI的令牌,但不是我的AAD API

Resource = https://graph.windows.net/
答案

您应该能够以静默方式获取其他API的访问令牌。

用户不需要登录两次:)

AAD会为您的应用返回一个刷新令牌,该令牌实际上可以为您的应用拥有权限的任何API提供访问令牌。

ADAL会自动为您完成此操作。

您需要指定ADAL您不希望第二个提示:

var graphTokenResult = await authContext.AcquireTokenAsync("https://graph.windows.net", clientId, redirectURI, new PlatformParameters(PromptBehavior.Never));

PromptBehavior.Never告诉ADAL不要提示用户,使用缓存中的令牌。

如果您希望ADAL显示登录屏幕,如果它无法使用其缓存来获取令牌,您也可以使用PromptBehavior.Auto

以上是关于使用GraphAPI的AAD令牌无法访问我自己的Rest API?的主要内容,如果未能解决你的问题,请参考以下文章

无法验证 AAD 访问令牌 - IDX10511:签名验证失败

在 Azure Pipelines 中使用托管标识:GetUserAccessToken:无法获取标识的访问令牌。 AAD 返回静默失败

如何使用 MSAL.js 为 Azure DevOps 获取有效的 AAD v2 令牌

如何使用MSAL.js为Azure DevOps获取有效的AAD v2令牌

为啥我的受 AAD 保护的 Azure 函数在使用来自 UWP 应用的访问令牌调用时返回 401?

在 AAD 保护的 Azure Web 应用程序中检索访问令牌