使用客户端凭据流以编程方式在 Azure AD 中添加应用程序
Adding Applications programmatically in Azure AD using Client Credentials Flow
为了与 Azure API 管理一起使用,我正在尝试以编程方式将 Applications 添加到 Azure Active Directory (AAD),在我的例子中是使用 Graph API.
我的场景如下:为了保护 Web API 我想使用 Azure API 管理,我想利用 AAD 的 OAuth 功能来完成有关身份验证和颁发 JWT 令牌,然后使用 validate-jwt 策略验证 Azure API 管理中的一切正常。这样做的好处是我可以或多或少地在后端服务中省略身份验证。
这工作正常,只要我在 Azure AD 中为消费 Web 应用程序创建了一个应用程序,但这必须从 Azure 门户手动完成; Azure APIm 不会自动执行。
现在我想做的是自动完成:我想将 APIs 在 APIm 中的订阅委托给我正在编写的其他一些网络应用程序,并从我想利用图 API 在 Azure AD 中创建一个应用程序并向 API 的应用程序授予权限。
我尝试做的第一件事是让第三个应用程序(我的服务应用程序)拥有对 Azure AD 中 Windows Azure Active Directory 应用程序的完整应用程序权限;这让我的应用程序可以使用 Graph REST API 访问 AAD。我设法使用 client_credentials 授权(来自 login.microsoft.com)获得了一个访问令牌,但是这个令牌不允许我在 https://graph.windows.net/(my AAD ID)/applications?api-version=1.5
:
上执行 POST
{
"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
权限,应用程序(仅应用程序)将无法创建或更新应用程序:
Note: Specifically excludes create or update for entities not listed above.
This includes: Application, Oauth2PermissionGrant, AppRoleAssignment, Device,
ServicePrincipal, TenantDetail, domains, etc.
接下来我尝试的是资源所有者密码授予 (grant_type=password
),另外传递我自己的凭据,这样我就可以在 Graph API 中冒充自己。现在,我的 POST
到 applications
终点成功了。
我的底线问题是:我能否授予我的应用程序足够的权限,以便我可以使用客户端凭据流而不是任何代表用户的流以编程方式添加应用程序?如果是这样,它是如何完成的?
对不起唐。我们目前没有任何可用于创建应用程序或服务主体或创建任何 oauth2 权限授予(或您在上面通过 Directory.ReadWrite.All 许可)。我们正在努力开发额外的仅限应用程序的权限,使您能够点亮此场景,但我没有可以给您的预计到达时间。
如果您使用应用+用户(代码流)并授予应用 Directory.AccessAsUser.All 权限 - 只要有用户,此操作应该 可行使用您的应用程序并且他们是租户管理员。不确定这是否是您可以接受的解决方法(我猜这与您使用的密码流程类似 - 尽管我建议您在此处使用代码流程)。
更新:我们为 AAD Graph 添加了几个新的仅限应用程序的权限。 Application.ReadWrite.OwnedBy(它允许一个应用程序 create/own 另一个应用程序 - 但只更新它创建的应用程序 - 它不能触及它不拥有的任何其他应用程序)和 Application.ReadWrite.All (这允许应用程序 create/manage 租户中的所有应用程序)。好像第一个比较合适。您可以在 AAD Graph resource.
的 Azure 门户中看到这些显示
为了与 Azure API 管理一起使用,我正在尝试以编程方式将 Applications 添加到 Azure Active Directory (AAD),在我的例子中是使用 Graph API.
我的场景如下:为了保护 Web API 我想使用 Azure API 管理,我想利用 AAD 的 OAuth 功能来完成有关身份验证和颁发 JWT 令牌,然后使用 validate-jwt 策略验证 Azure API 管理中的一切正常。这样做的好处是我可以或多或少地在后端服务中省略身份验证。
这工作正常,只要我在 Azure AD 中为消费 Web 应用程序创建了一个应用程序,但这必须从 Azure 门户手动完成; Azure APIm 不会自动执行。
现在我想做的是自动完成:我想将 APIs 在 APIm 中的订阅委托给我正在编写的其他一些网络应用程序,并从我想利用图 API 在 Azure AD 中创建一个应用程序并向 API 的应用程序授予权限。
我尝试做的第一件事是让第三个应用程序(我的服务应用程序)拥有对 Azure AD 中 Windows Azure Active Directory 应用程序的完整应用程序权限;这让我的应用程序可以使用 Graph REST API 访问 AAD。我设法使用 client_credentials 授权(来自 login.microsoft.com)获得了一个访问令牌,但是这个令牌不允许我在 https://graph.windows.net/(my AAD ID)/applications?api-version=1.5
:
POST
{
"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
权限,应用程序(仅应用程序)将无法创建或更新应用程序:
Note: Specifically excludes create or update for entities not listed above. This includes: Application, Oauth2PermissionGrant, AppRoleAssignment, Device, ServicePrincipal, TenantDetail, domains, etc.
接下来我尝试的是资源所有者密码授予 (grant_type=password
),另外传递我自己的凭据,这样我就可以在 Graph API 中冒充自己。现在,我的 POST
到 applications
终点成功了。
我的底线问题是:我能否授予我的应用程序足够的权限,以便我可以使用客户端凭据流而不是任何代表用户的流以编程方式添加应用程序?如果是这样,它是如何完成的?
对不起唐。我们目前没有任何可用于创建应用程序或服务主体或创建任何 oauth2 权限授予(或您在上面通过 Directory.ReadWrite.All 许可)。我们正在努力开发额外的仅限应用程序的权限,使您能够点亮此场景,但我没有可以给您的预计到达时间。
如果您使用应用+用户(代码流)并授予应用 Directory.AccessAsUser.All 权限 - 只要有用户,此操作应该 可行使用您的应用程序并且他们是租户管理员。不确定这是否是您可以接受的解决方法(我猜这与您使用的密码流程类似 - 尽管我建议您在此处使用代码流程)。
更新:我们为 AAD Graph 添加了几个新的仅限应用程序的权限。 Application.ReadWrite.OwnedBy(它允许一个应用程序 create/own 另一个应用程序 - 但只更新它创建的应用程序 - 它不能触及它不拥有的任何其他应用程序)和 Application.ReadWrite.All (这允许应用程序 create/manage 租户中的所有应用程序)。好像第一个比较合适。您可以在 AAD Graph resource.
的 Azure 门户中看到这些显示