使用客户端凭据流以编程方式在Azure AD中添加应用程序

don*_*tin 7 api azure oauth-2.0 azure-api-management azure-ad-graph-api

为了与Azure API管理一起使用,我尝试以编程方式将应用程序添加到Azure Active Directory(AAD),在我的例子中使用Graph API.

我的方案如下:为了保护我想要使用Azure API Management管理的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)来获得访问令牌,但该令牌并不让我做一个POSThttps://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."
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我发现(https://msdn.microsoft.com/Library/Azure/Ad/Graph/howto/azure-ad-graph-api-permission-scopes),即使我授予了Directory.ReadWrite.All许可,该应用程序(仅限应用程序)将无法创建或更新应用程序:

注意:特别排除上面未列出的实体的创建或更新.这包括:应用程序,Oauth2PermissionGrant,AppRoleAssignment,Device,ServicePrincipal,TenantDetail,域等.

我尝试的下一件事是资源所有者密码授予(grant_type=password),另外传递我自己的凭据,以便我可以在Graph API中模仿自己.现在,我POSTapplications终点成功了.

我的最后一个问题是:我是否可以为我的应用程序授予足够的权限,以便我可以使用客户端凭据流以编程方式添加应用程序,而不是代表用户执行的任何流程?如果是这样,它是如何完成的?

Dan*_*SFT 5

抱歉,唐。当前,我们没有客户端凭据流的任何权限范围(仅适用于应用程序),可用于创建应用程序或服务主体或创建任何oauth2权限授予(或上面通过目录提及的任何其他实体)。 ReadWrite.All权限)。我们正在研究其他仅适用于应用程序的权限,这些权限将使您可以简化这种情况,但是我没有可以提供给您的ETA。

如果您使用应用程序+用户(代码流)并向该应用程序授予Directory.AccessAsUser.All权限,则该操作应该是可能的-只要有一个使用您的应用程序的用户并且他们是租户管理员即可。不知道这是否对您来说是可以接受的解决方法(我想这与您在密码流中使用的方法类似-尽管我建议您在此处使用代码流)。

更新:我们为AAD Graph添加了几个新的仅应用程序权限。Application.ReadWrite.OwnedBy(允许一个应用程序创建/拥有另一个应用程序-但仅更新其创建的应用程序-它将无法触摸其不拥有的任何其他应用程序)AND Application.ReadWrite.All(其中允许应用在租户中创建/管理所有应用)。似乎第一个比较合适。您可以在Azure门户中的AAD图资源查看这些显示。