【问题标题】:How can I assign access to an application provisioned in Azure via the Graph API?如何通过 Graph API 分配对 Azure 中预配的应用程序的访问权限?
【发布时间】:2017-06-06 13:14:28
【问题描述】:

我们有几个依赖 Azure AD 来配置访问的应用程序。必须手动为每个用户分配访问权限是冗长的,我希望通过 Graph API 自动执行此过程。

我正在使用 PowerShell 来执行此操作,并且我可以成功地通过 API 进行身份验证并进行调用以识别用户等。
我正在努力以编程方式分配对应用程序的访问权限。

根据文档,这似乎只存在于 Beta 版本中。 https://developer.microsoft.com/en-us/graph/docs/api-reference/beta/api/approleassignment_update

但是,当我使用 Graph Explorer 时,intellisense 不会显示此方法。 https://developer.microsoft.com/en-us/graph/graph-explorer

如果我仍然尝试调用它,我会收到错误:

不支持的段类型

这向我表明此方法不存在,只是没有从文档中删除。

GitHub 上有一个关于 Graph HERE 的未解决问题。

有一些 SO 线程得到了 MSFT 的回复,然后没有解决 HERE

I found a C# sample 看起来可能会这样做,但它掩盖了库后面的细节,我不想维护 C# 应用程序。

我找不到任何关于这是否可以通过 Graph API 实现的信息。鉴于其中一些帖子已有一年的历史,如果微软没有推进这一点,我会感到惊讶。我所能看到的只是引用不再使用 AFAIK 的旧 Graph API 的文档。

是否可以仅使用 REST 和 Graph API 分配对 Azure 中配置的应用程序的访问权限?

【问题讨论】:

标签: rest powershell azure-active-directory microsoft-graph-api


【解决方案1】:

根据我的理解,我们可以使用 Azure Graph REST 来实现相同的目标。

以下是供您参考的代码:

public async void AssignRoleToUser()
{
    var client = GraphHelper.CreateGraphClient();

    ServicePrincipal servicePrincipal = (ServicePrincipal)client.ServicePrincipals.GetByObjectId("d90b4929-a2d5-43bc-8fc0-1e0adb640575").ExecuteAsync().Result;

    Microsoft.Azure.ActiveDirectory.GraphClient.User user =(Microsoft.Azure.ActiveDirectory.GraphClient.User)client.Users.GetByObjectId("b2d2cadd-21f5-4021-beb5-7b23ebd5364c").ExecuteAsync().Result;

    AppRoleAssignment appRoleAssignment = new AppRoleAssignment();

    // just use a known appRole id for this example
    appRoleAssignment.Id = servicePrincipal.AppRoles.FirstOrDefault().Id;

    // the service principal to add the group with the app role
    appRoleAssignment.ResourceId = Guid.Parse(servicePrincipal.ObjectId);

    appRoleAssignment.PrincipalType = "User";

    // the id of the user
    appRoleAssignment.PrincipalId = Guid.Parse("b2d2cadd-21f5-4021-beb5-7b23ebd5364c");

    user.AppRoleAssignments.Add(appRoleAssignment);
    await user.UpdateAsync();

}

此外,如果您不指定自定义角色,则必须使用默认 id(零 GUID)。

更多关于Azure AD Graph实体参考,可以参考here

更新

POST:https://graph.windows.net/{tenantId}/directoryObjects/{userId}/Microsoft.DirectoryServices.User/appRoleAssignments?api-version=1.6

{     
    "odata.type":"Microsoft.DirectoryServices.AppRoleAssignment",
    "id":"{roleId}",
    "principalId":"{userId}",
    "principalType":"User",
    "resourceId":"{servicePrincipalId}"
}

【讨论】:

  • 查看原始问题:I found a C# sample which looks like it might do this but it obscures the details away behind libraries and I don't want to maintain a C# application. - 如果这些库正常工作,它们必须对 API 进行有效调用。我想知道这个调用是什么,这样我就可以独立于平台做同样的事情。
  • 使用 Fiddler 很容易捕获请求,我已经在帖子中更新了它。
  • 那是旧的 API 吗?这不是官方Graph页面上引用的地址。我会看看这个查询在此期间是否有效。
  • 这是在 Microsoft Graph REST 之前发布的 Azure AD Graph REST。您可以参考this link。这两个 API 的区别可以参考这个blog
  • 两篇文章都证实了我的想法,即一旦 Graph API 功能完成,旧的 Azure API 就会被淘汰。我想我宁愿等到新的 API 更新之后再重写脚本。我无法让这个查询工作,它说401 unauthorized。我假设适用于 Graph 的令牌与 Azure 不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 2019-09-06
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 2013-12-05
相关资源
最近更新 更多