我必须更改我的代码才能获得一个有效的令牌,以便我可以使用图谱API访问AAD用户的详细个人资料信息
然而令我沮丧的是,最终意识到这个令牌不允许访问我的API,这也是在AAD后面的Azure上托管的?
是否有允许两者的方法?
注意问题在于我在标题中传递的资源 - 它既可以用于我的API,也可以用于图表,但我肯定不能要求用户登录两次?
解决方案是什么,然后在用于登录的图形令牌后嵌入客户端密码...?
代码示例使用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/
答案 0 :(得分:2)
您应该能够以静默方式获取其他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
。