Azure 使用GraphAPI的AAD令牌不';无法访问我自己的RESTAPI?

Azure 使用GraphAPI的AAD令牌不';无法访问我自己的RESTAPI?,azure,active-directory,azure-active-directory,adal,Azure,Active Directory,Azure Active Directory,Adal,我必须更改代码,以便获得一个有效的令牌,该令牌允许我使用Graph API访问AAD用户的详细配置文件信息 然而,令我沮丧的是,我最终意识到这个令牌不允许访问我的API,而我的API也托管在AzureBehindAAD上 是否有一种方法可以同时允许这两种情况 请注意,问题在于我在标题中传递的资源——它要么用于我的API,要么用于图形,但我肯定不能要求用户登录两次 除了嵌入用于登录的客户机机密一次图令牌之外,解决方案是什么 代码示例使用Microsoft.IdentityModel.Clients

我必须更改代码,以便获得一个有效的令牌,该令牌允许我使用Graph API访问AAD用户的详细配置文件信息

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

是否有一种方法可以同时允许这两种情况

请注意,问题在于我在标题中传递的资源——它要么用于我的API,要么用于图形,但我肯定不能要求用户登录两次

除了嵌入用于登录的客户机机密一次图令牌之外,解决方案是什么

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

示例1-返回一个令牌,我可以将其用于API,但不能用于图形

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的令牌,但不能用于我的AADAPI

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

您应该能够以静默方式获取另一个API的访问令牌

用户不需要登录两次:)

AAD将为您的应用程序返回一个刷新令牌,该令牌实际上能够为您的应用程序有权访问的任何API获取访问令牌

阿达尔会自动为你做这件事

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

var graphTokenResult = await authContext.AcquireTokenAsync("https://graph.windows.net", clientId, redirectURI, new PlatformParameters(PromptBehavior.Never));
PromptBehavior.Never
告诉ADAL不要提示用户,使用缓存中的令牌


如果您想让ADAL在无法使用其缓存获取令牌时显示登录屏幕,您也可以使用
PromptBehavior.Auto

请原谅,这是一个新概念,因此我获得了初始令牌,我将其保存在缓存中,但是使用该令牌为我的API获取另一个令牌时,调用应该是什么样子?您应该能够像以前一样执行第一个调用来获取API的令牌。在那之后再加上这个就足够了。当我说缓存时,我指的是ADAL自己的缓存:)它在内部缓存内存中的所有令牌。因此,如果您稍后请求一个令牌,它在缓存中找到一个,它不会进行任何调用。好的,让我澄清一下-我已手动检索该令牌并将其放入Postman并调用我的API,并收到一个未经授权的页面。只有将Graph设置为资源时才会发生这种情况。所以我不明白的是,我已经在缓存中有一个令牌,就像你说的,我通常只会将它添加到头中,但我不能,因为它会导致那个错误。那么,我应该如何使用上面的令牌来获得我可以用于API的令牌…?对不起,我现在明白了-再次感谢您!对于
PromptBehavior.Never
,如果需要提示,则AcquireToken请求将失败,并且永远不会返回提示。因为大多数人对待“从不”就像对待现实生活中的“从不”。。这是一个温柔的永远。。可能会在某一天提示您获取凭据。。你是说这是一种偶然的交易。。