【问题标题】:Call two distinct Azure AD protected APIs from Web App从 Web 应用调用两个不同的受 Azure AD 保护的 API
【发布时间】: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_idapp_secret,但是我返回的JWT 不包含任何用户 识别声明,所以现在我的API 对调用用户一无所知,它只知道机密客户端(我的 Web 应用)确实提供了一个有效的令牌。

我如何请求一个令牌以成功调用我的 API 并返回某种用户声明user principal nameuser 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


【解决方案1】:

您可以为另一个 API 请求具有相同授权码的第二个访问令牌。

根据您请求访问令牌的方式,令牌的受众可能是 API 的客户端 ID 或应用程序 ID URI。因此,您必须确保两者都是 API 中接受的受众。

对于 ASP.NET Core API,您可以在 JWT Bearer 身份验证配置中添加以下内容:

TokenValidationParameters = new TokenValidationParameters
{
    ValidAudiences = new [] { "https://blabla", "g-u-i-d" }
}

【讨论】:

    猜你喜欢
    • 2020-02-19
    • 2017-11-02
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多