【问题标题】:How do I get the "Assigned Role" of a User in Azure Active Directory?如何在 Azure Active Directory 中获取用户的“分配的角色”?
【发布时间】:2018-10-22 14:13:56
【问题描述】:

我正在将 Azure AD 与已注册的应用程序一起使用,并且我正在使用 Microsoft Graph API 来查询 AD。

下面的代码告诉用户分配到哪些组

var memberof = await graphClient.Users[xxx].MemberOf.Request().GetAsync();

我使用的是标准 AD 包,似乎团体受到了一些限制,我需要购买“Premium AD 包”才能完全使用它们。

所以我不想使用组信息。我对分配给我的用户的角色感兴趣,这些角色已放入我的应用程序清单中。

例如

"appRoles": [
    {
      "allowedMemberTypes": [
        "User"
      ],
      "displayName": "Case Manager",
      "id": "{A_Guid}",
      "isEnabled": true,
      "description": "Case Manager's can create and assign Cases to other users",
      "value": "CaseManager"
    }, 

那么,如何使用 Graph Api 告诉我用户是否具有特定角色?

【问题讨论】:

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


    【解决方案1】:

    1。微软图形 API

    读取分配给用户的所有应用程序特定角色(即 AppRoleAssignments)的功能仅作为当前 AFAIK 的 Microsoft Graph API beta 端点 的一部分提供。这在 v1.0 中不可用。你可以阅读版本here

    从名称“beta”可以看出,它预计不会是生产应用程序可以依赖的稳定版本。阅读this SO Post by Marc LaFleur中的更多具体点

    确切的 API (Microsoft Docs Reference):

    GET    https://graph.microsoft.com/beta/users/{id | userPrincipalName}/appRoleAssignments
    

    我尝试使用 GraphServiceClient(用于 Microsoft Graph 的 .NET SDK),但找不到与 AppRoleAssignments 相关的任何内容。 (可能是因为 SDK 使用的是 1.0 稳定版的元数据,而不是 beta 版)

    无论如何,如果您仍然可以对此进行测试,请使用 Microsoft Graph Explorer 或直接从 C# 代码调用端点

    string graphRequest = $"https://graph.microsoft.com/beta/users/{my user GUID}/appRoleAssignments";
    HttpClient client = new HttpClient();
    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, graphRequest);
    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
    HttpResponseMessage response = await client.SendAsync(request);
    

    2。 Windows Azure AD 图形 API

    尽管建议尽可能使用 Microsoft Graph API,但仍有一些情况下 Microsoft Graph 尚未赶上,因此您不得不使用 Azure AD Graph API。应用程序管理相关的案例就是其中的一些。

    所以你可以使用这个 Azure AD Graph API。我从Azure AD Graph Explorer 快​​速测试了它,它工作正常。

    https://graph.windows.net/{yourtenantid}/users/{id}/appRoleAssignments?api-version=1.6
    

    就像 Microsoft Graph Library for .NET 一样,您可以使用 Azure AD Graph Client Library for .NET,您的代码将如下所示..

    aadgraphClient.Users["<user guid>"].AppRoleAssignments;
    

    附带说明,由于您专门针对 Microsoft Graph API 提出了该问题,因此我已相应地回答了该问题。

    至少对于应用程序的当前登录用户,您始终可以从作为 Azure Active Directory 访问令牌的一部分的 Role claims 中找到分配给他们的 Application Roles

    虽然这仅对当前用户的角色有帮助,但如果您尝试跨应用程序的所有用户进行管理,则对管理类型的场景没有帮助。这是一个读取角色声明并根据当前登录用户的应用角色进行授权的示例。

    Authorization in a web app using Azure AD application roles & role claims

    【讨论】:

    • 这看起来很棒,感谢您花这么多时间。我应该尽快测试那个 beta 端点,希望我可以标记为已接受的答案。
    • 谢谢,效果很好!我正在使用 beta 端点,值得注意的是,虽然只是 appRole.Id,但您没有获得 appRole.value,因此它需要从您的清单中手动映射。
    • @RohitSaigal,感谢您的详细回答。有没有办法在 C# 中使用 Azure AD Graph 针对租户查找所有角色?我的 api 调用是 graph.windows.net{tenant_Id}/roleAssignments。在 C# 级别,GraphClient 类似乎没有任何角色分配定义。
    • 有办法的。我已经详细解释了我在这里回答你的问题的一部分。stackoverflow.com/questions/55071897/…
    【解决方案2】:

    我刚刚找到了一种在应用程序级别获取用户角色的方法。

    您可以通过更新清单的 appRoles 数组来创建应用级角色。

    [azure/app registrations/<your-app>/manifest)]
    

    我使用 Microsoft.Graph.Beta 来访问服务主体 api。

    var userRoles = await _client.Me.AppRoleAssignments.Request().GetAsync();
    

    上述查询将获取用户的所有应用程序角色。

    var appRoleAssignments = await _Client.ServicePrincipals[<<application_objectId>>].Request().GetAsync();
    

    上述查询将获取在清单级别分配的应用程序的所有角色。

    And application object Id could be found at [azure/app registrations/<your-app>)] -> Object ID
    

    并执行以下获取用户角色列表

    var roles = new List<string>();
    if (appRoleAssignments != null && appRoleAssignments.AppRoles.Any())
    {
            var userRolesOfCurrentResource = userRoles.First(role => role.ResourceId == Guid.Parse(<<application object id>>));
            if(userRolesOfCurrentResource!=null)
            {
                  var role = appRoleAssignments.AppRoles.First(role => role.Id == userRolesOfCurrentResource.AppRoleId);
                  if (role!=null)
                  {
                      roles.Add(role.Value);
                  }
            }
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-06
      • 2020-09-21
      • 2016-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      相关资源
      最近更新 更多