为了与Azure API管理一起使用,我尝试使用Graph API以编程方式将应用程序添加到Azure Active Directory(AAD)。
我的方案如下:为了保护我想要使用Azure API Management管理的Web API,我想利用AAD的OAuth功能来完成有关身份验证和发布JWT令牌的繁重工作,然后只需使用validate-jwt策略验证Azure API Management中的一切正常。这样做的好处是我可以在后端服务中或多或少地省略身份验证。
这很好,只要我在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 grant(来自login.microsoft.com)获取访问令牌,但是此令牌不允许我在POST
上执行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
终点成功了。
我的最后一个问题是:我是否可以为我的应用程序授予足够的权限,以便我可以使用客户端凭据流以编程方式添加应用程序,而不是代表用户执行的任何流程?如果是这样,它是如何完成的?
答案 0 :(得分:5)
抱歉唐。我们目前没有任何客户端凭据流(仅限app)的权限范围,可用于创建应用程序或服务主体或创建任何oauth2权限授予(或上面通过目录提到的任何其他实体)。 ReadWrite.All权限)。我们正在开发其他仅限应用的权限,以便您点亮此方案,但我没有可以提供的ETA。
如果您使用app +用户(代码流)并授予应用程序Directory.AccessAsUser.All权限,则此操作应该 - 只要有用户使用您的应用程序并且他们是租户管理员。不确定这是否是一个可接受的解决方法(我猜这与你使用的密码流类似 - 虽然我建议你在这里使用代码流。)
更新:我们为AAD Graph添加了一些仅限新应用的权限。 Application.ReadWrite.OwnedBy(允许应用创建/拥有另一个应用 - 但只更新它创建的应用 - 它将无法触及它不拥有的任何其他应用)和Application.ReadWrite.All(其中允许应用程序创建/管理租户中的所有应用程序)。似乎第一个是合适的。您 应该在Azure门户中看到这些显示的AAD Graph资源。但是他们目前没有记录AFAIK。
希望这有帮助,