从 Web App 调用两个不同的受 Azure AD 保护的 API
Call two distinct Azure AD protected APIs from Web App
设置:
- ASP.NET 顶部带有 Azure AD 的 MVC5 应用程序(完整框架 NET 4.7)
- WebAPI(完整框架 NET 4.7),顶部为 Azure AD
- .NET ADAL 3.x 两个应用程序中使用的库(不是 MSAL)
在 Web 应用程序中,在 Katana 中,OWIN 中间件:
- 我对用户进行身份验证(我控制的目录中的组织帐户)
- 然后我将授权码交换为访问令牌
(与resourceId: https://graph.microsoft.com
)
- 我将生成的访问令牌放入用户声明中
现在一切都很好,我可以使用访问令牌作为 Bearer 并调用 Microsoft Graph 并获取 /me
用户个人资料、图片等等。
但是我如何从我的 Web 应用程序调用我自己的受保护的 Azure AD API?
我不能只将授权码第二次换成另一个 resourceId
。我可以 context.AcquireTokenAsync()
使用 app_id
和 app_secret
,但是我取回的 JWT 不包含任何 user 身份声明,所以现在我的 API 对调用用户一无所知,它只知道机密客户端(我的 Web 应用程序)确实提供了有效令牌。
我如何请求一个可以成功调用我的 API 的令牌,该令牌将 return 某种用户 声明 ? 用户主体名称或用户ID可能就足够了。
我应该将所有 Microsoft Graph 调用逻辑移动到 WebAPI 并为我的 API 的 resourceId
交换授权码,还是有一个就地解决方案我的难题?这里的正确模式是什么?好吧,不是 对,也许 更好。
您可以为另一个 API.
请求具有相同授权码的第二个访问令牌
根据您请求访问令牌的方式,令牌的受众可能是 API 的客户端 ID 或应用程序 ID URI。因此,您必须确保两者都是 API.
中接受的受众
如果是ASP.NET Core APIs,可以在JWT Bearer authentication config中添加如下内容:
TokenValidationParameters = new TokenValidationParameters
{
ValidAudiences = new [] { "https://blabla", "g-u-i-d" }
}
设置:
- ASP.NET 顶部带有 Azure AD 的 MVC5 应用程序(完整框架 NET 4.7)
- WebAPI(完整框架 NET 4.7),顶部为 Azure AD
- .NET ADAL 3.x 两个应用程序中使用的库(不是 MSAL)
在 Web 应用程序中,在 Katana 中,OWIN 中间件:
- 我对用户进行身份验证(我控制的目录中的组织帐户)
- 然后我将授权码交换为访问令牌
(与resourceId: https://graph.microsoft.com
) - 我将生成的访问令牌放入用户声明中
现在一切都很好,我可以使用访问令牌作为 Bearer 并调用 Microsoft Graph 并获取 /me
用户个人资料、图片等等。
但是我如何从我的 Web 应用程序调用我自己的受保护的 Azure AD API?
我不能只将授权码第二次换成另一个 resourceId
。我可以 context.AcquireTokenAsync()
使用 app_id
和 app_secret
,但是我取回的 JWT 不包含任何 user 身份声明,所以现在我的 API 对调用用户一无所知,它只知道机密客户端(我的 Web 应用程序)确实提供了有效令牌。
我如何请求一个可以成功调用我的 API 的令牌,该令牌将 return 某种用户 声明 ? 用户主体名称或用户ID可能就足够了。
我应该将所有 Microsoft Graph 调用逻辑移动到 WebAPI 并为我的 API 的 resourceId
交换授权码,还是有一个就地解决方案我的难题?这里的正确模式是什么?好吧,不是 对,也许 更好。
您可以为另一个 API.
请求具有相同授权码的第二个访问令牌根据您请求访问令牌的方式,令牌的受众可能是 API 的客户端 ID 或应用程序 ID URI。因此,您必须确保两者都是 API.
中接受的受众如果是ASP.NET Core APIs,可以在JWT Bearer authentication config中添加如下内容:
TokenValidationParameters = new TokenValidationParameters
{
ValidAudiences = new [] { "https://blabla", "g-u-i-d" }
}