8

为了与 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)获得访问令牌,但是这个令牌不允许我做一个POSTon 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 中模拟自己。现在,我POSTapplications终点成功了。

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

4

1 回答 1

5

对不起唐。我们目前没有任何可用于创建应用程序或服务主体或创建任何 oauth2 权限授予(或您通过目录在上面提到的任何其他实体)的客户端凭据流(仅限应用程序)的权限范围。 ReadWrite.All 权限)。我们正在开发额外的仅限应用程序权限,使您能够点亮此场景,但我没有可以给您的 ETA。

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

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

于 2016-01-28T22:54:00.787 回答