为了与 Azure API 管理一起使用,我尝试以编程方式将应用程序添加到 Azure Active Directory (AAD),在我的例子中是使用 Graph API。
我的场景如下:为了保护我想使用 Azure API 管理管理的 Web API,我想利用 AAD 的 OAuth 功能来完成有关身份验证和颁发 JWT 令牌的繁重工作,然后只使用 validate-jwt 策略验证 Azure API 管理中的一切正常。这样做的好处是我可以或多或少地在后端服务中省略身份验证。
只要我在 Azure AD 中为使用 Web 应用程序创建了一个应用程序,就可以正常工作,但这必须从 Azure 门户手动完成;Azure APIm 不会自动执行此操作。
现在我要尝试自动完成任务:我想将 APIm 中的 API 订阅委托给我正在编写的其他一些 Web 应用程序,然后我想利用 Graph API 在 Azure 中创建一个应用程序AD 并授予 API 应用程序的权限。
我尝试做的第一件事是让第三个应用程序(我的服务应用程序)对 Azure AD 中的 Windows Azure Active Directory 应用程序拥有完整的应用程序权限;这让我的应用程序可以使用 Graph REST API 访问 AAD。我设法使用 client_credentials 授权(来自 login.microsoft.com)获得访问令牌,但是这个令牌不允许我做一个POST
on https://graph.windows.net/(my AAD ID)/applications?api-version=1.5
:
{
"odata.error": {
"code": "Authorization_RequestDenied",
"message": {
"lang": "en",
"value": "Insufficient privileges to complete the operation."
}
}
}
我发现(https://msdn.microsoft.com/Library/Azure/Ad/Graph/howto/azure-ad-graph-api-permission-scopes)即使我授予Directory.ReadWrite.All
权限,应用程序(仅限应用程序)将无法创建或更新应用程序:
注意:特别不包括上面未列出的实体的创建或更新。这包括:Application、Oauth2PermissionGrant、AppRoleAssignment、Device、ServicePrincipal、TenantDetail、域等。
我尝试的下一件事是资源所有者密码授予 ( grant_type=password
),另外传递我自己的凭据,以便我可以在 Graph API 中模拟自己。现在,我POST
的applications
终点成功了。
我的底线问题是:我是否可以向我的应用程序授予足够的权限,以便我可以使用客户端凭据流以编程方式添加应用程序,而不是代表用户的任何流?如果是这样,它是如何完成的?