我正在将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告诉我用户是否具有特定角色?
答案 0 :(得分:2)
读取分配给用户的所有应用程序特定角色(即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);
尽管建议尽可能使用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);
}
}
}