【发布时间】:2018-06-25 04:24:40
【问题描述】:
设置:
- 顶部带有 Azure AD 的 ASP.NET MVC5 应用程序(完整框架 NET 4.7)
- WebAPI(完整框架 NET 4.7),顶部带有 Azure AD
- 两个应用程序都使用了 .NET ADAL 3.x 库(不是 MSAL)
在 Web App 中,在 Katana 中,OWIN 中间件:
- 我对用户进行身份验证(我控制的目录中的 org 帐户)
- 然后我交换访问令牌的授权码
(使用resourceId: https://graph.microsoft.com) - 我将生成的访问令牌放入用户声明中
现在一切都很好,我可以使用访问令牌作为承载并调用 Microsoft Graph 并获取 /me 用户个人资料、图片等等。
但是如何从我的 Web 应用调用我自己的受 Azure AD 保护的 API?
我不能再次将授权码换成不同的resourceId。我可以用context.AcquireTokenAsync() 和app_id 和app_secret,但是我返回的JWT 不包含任何用户 识别声明,所以现在我的API 对调用用户一无所知,它只知道机密客户端(我的 Web 应用)确实提供了一个有效的令牌。
我如何请求一个令牌以成功调用我的 API 并返回某种用户声明? user principal name 或 user id 可能就足够了。
我是否应该将所有 Microsoft Graph 调用逻辑移至 WebAPI 并为我的 API 的resourceId 交换授权代码,或者是否有针对我的难题的就地解决方案?这里的正确模式是什么?好吧,不是正确,也许只是更好。
【问题讨论】:
-
为什么不能第二次交换授权码?你有什么错误吗?
-
这是 OAuth2 的事情,我的意思是这是一个有效的流程吗?我确实尝试过从 ADAL 获得空异常,但如果这应该是可能的,我可以回到绘图板再试一次。
-
AFAIK 它应该是.. ADAL 的 NRE 听起来很奇怪
-
您必须将它们都配置为 API 中的有效受众。检查一下。
-
没错。将两个观众添加到
TokenValidationParameters = {}为ValidAudiences = new [] { "https://blabla", "g-u-i-d" },它就像一个梦一样工作。如果您愿意发布答案,我会将其标记为已接受。感谢您的宝贵时间。
标签: asp.net-mvc azure-active-directory microsoft-graph-api adal