2016-01-13 121 views
6

为了与Azure API Management一起使用,我尝试以编程方式将应用程序添加到Azure Active Directory(AAD),在我的情况下使用Graph API。在Azure AD中使用客户端证书流程以编程方式添加应用程序

我的方案如下:为了确保Web API的安全,我希望利用Azure API Management来管理AAD的OAuth功能,以完成有关身份验证和发布JWT令牌的繁重工作,然后使用validate-jwt策略在Azure API管理中验证一切正常。这样做的好处是我可以在后端服务中或多或少省略身份验证。

这很好,只要我在Azure AD中为消费Web应用程序创建了一个应用程序,但这必须从Azure门户手动完成; Azure APIm不会自动执行此操作。

现在我正在努力完成自动完成任务:我想将订阅API 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." 
      } 
     } 
    } 

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

注意:明确排除了创建或更新以上未列出的实体。 这包括:应用程序,Oauth2PermissionGrant,AppRoleAssignment,设备, ServicePrincipal,TenantDetail,域名等

我想是资源所有者密码格兰特(grant_type=password),另外通过我自己的凭证,以便接下来的事情我可以在Graph API中模拟自己。现在,我的POSTapplications终点成功。

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

+0

我发现多了一个讨论,其中最有可能归结为完全相同的问题,我有: https://social.technet.microsoft.com/Forums/en-US/82ab8a7d- e17b-4e4a-9615-2bdf43f1866a/graph-api-call-returns-insufficient-privileges-to-complete-the-operation?forum = WindowsAzureAD 此外,我还发现讨论Graph API权限的页面: https ://msdn.microsoft.com/Library/Azure/Ad/Graph/howto/azure-ad-graph-api-permission-scopes – donmartin

+0

他们是否为您的问题提供解决方案? – juvchan

+0

不幸的是,不幸的是没有。假冒管理员是迄今为止我发现的唯一“解决方案”。 – donmartin

回答

3

对不起。我们目前没有任何可用于创建应用程序或服务主体的客户端凭证流程(仅限于应用程序)的权限范围,或者创建任何oauth2权限授予(或您通过目录提及的其他任何实体)。 ReadWrite.All权限)。我们正在研究额外的仅限应用的权限,以便您可以点亮此方案,但我没有可以提供给您的ETA。

此操作如果您使用的应用程序+用户(码流)应可能并授予应用程序的权限Directory.AccessAsUser.All - 只要有一个用户使用你的应用程序,他们是房客管理员。不知道这对你是否可接受的解决方法(我猜是类似于你使用密码流 - 尽管我建议你在这里使用代码流)。

UPDATE:我们为AAD Graph添加了一些新的应用程序唯一权限。 Application.ReadWrite.OwnedBy(它允许应用程序创建/拥有另一个应用程序 - 但只更新它创建的应用程序 - 它将无法触摸它不拥有的任何其他应用程序)AND Application.ReadWrite.All(它允许应用程序创建/管理租户中的所有应用程序)。看起来像第一个是合适的。您应该应该看到这些显示在Azure门户为AAD图形资源。然而,他们目前没有记录在AFAIK。

希望这有助于

+0

是的,这将是一种可接受的解决方法。与此同时,我们还提出了以下想法(未经验证),它们沿着相同的方向发展,但不要求具有API消费者角色的用户成为AD管理员:我们可以“启动”控制Web应用程序使用AD管理员凭据进行授权代码授予(以便我们不必将其存储在应用程序中),然后在应用程序中刷新令牌以将该管理员的模拟内容保留在应用程序中,而无需手动干预。但是这也会让人感觉不好。 – donmartin

+0

客户端证书在一般工作中是如何流动的? – Gobliins

+0

不,它不。资源所有者密码授权。 – donmartin

相关问题