如何在Azure Active Directory中获得用户的“分配角色”?

时间:2018-10-22 14:13:56

标签: azure-active-directory microsoft-graph

我正在将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告诉我用户是否具有特定角色?

2 个答案:

答案 0 :(得分:2)

1。 Microsoft Graph API

读取分配给用户的所有应用程序特定角色(即AppRoleAssignments)的功能仅可作为 Microsoft Graph API beta端点(当前AFAIK)的一部分使用。它在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 Graph 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

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

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

在旁注中,由于您已经专门针对Microsoft Graph API提出了问题,因此我已相应回答。

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

这虽然仅对当前用户有用,而在管理类情况下却无济于事,如果您试图遍历所有用户使用某个应用程序。这是一个示例,该示例读取角色声明并基于“应用角色”为当前登录的用户进行授权。

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

答案 1 :(得分:0)

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

您可以通过更新清单的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);
              }
        }
 }