Сначала проверьте этот пример кода , который использует OpenID Connect для входа в систему пользователей и использует MSAL для получения токена Microsoft Graph API для удаления групп.
Если вы сконфигурируете свое приложение наполучить утверждения группы путем редактирования манифеста:
{
...
"errorUrl": null,
"groupMembershipClaims": "SecurityGroup",
...
}
Идентификатор объекта групп безопасности, членом которых является зарегистрированный пользователь, возвращается в утверждении группы токена.
Если пользователь является участником большего числа групп, чем предел превышения (150 для токенов SAML, 200 для токенов JWT), то платформа Microsoft Identity Platform не отправляет утверждение о группах в токене.Вместо этого он включает избыточное требование в токене, которое указывает приложению на запрос API Graph для получения членства в группе пользователя.
{
...
"_claim_names": {
"groups": "src1"
},
{
"_claim_sources": {
"src1": {
"endpoint":"[Graph Url to get this user's group membership from]"
}
}
...
}
Таким образом, вы можете следить за процессом:
Проверьте наличие в заявке _claim_names с одним из значений, являющихся группами.Это указывает на переизбыток.
Если найден, вызовите конечную точку, указанную в _claim_sources, чтобы получить группы пользователей.
Если ничего не найдено, посмотритев заявку на группы для групп пользователей.
Конечно, вы можете напрямую вызывать Microsoft Graph API для вывода групп текущего пользователя без , используя group claims
:
https://docs.microsoft.com/en-us/graph/api/user-list-memberof?view=graph-rest-1.0&tabs=http
Затем вы можете авторизоваться на основе этих групп.Например, если используется политика:
services.AddAuthorization(options =>
{
options.AddPolicy("GroupsCheck", policy =>
policy.Requirements.Add(new GroupsCheckRequirement("YourGroupID")));
});
services.AddScoped<IAuthorizationHandler, GroupsCheckHandler>();
GroupsCheckRequirement.cs:
public class GroupsCheckRequirement : IAuthorizationRequirement
{
public string groups;
public GroupsCheckRequirement(string groups)
{
this.groups = groups;
}
}
GroupsCheckHandler.cs:
public class GroupsCheckHandler : AuthorizationHandler<GroupsCheckRequirement>
{
private readonly ITokenAcquisition tokenAcquisition;
private readonly IMSGraphService graphService;
public GroupsCheckHandler(ITokenAcquisition tokenAcquisition, IMSGraphService MSGraphService)
{
this.tokenAcquisition = tokenAcquisition;
this.graphService = MSGraphService;
}
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context,
GroupsCheckRequirement requirement)
{
string accessToken = await tokenAcquisition.GetAccessTokenOnBehalfOfUserAsync(new[] { Constants.ScopeUserRead, Constants.ScopeDirectoryReadAll });
User me = await graphService.GetMeAsync(accessToken);
IList<Group> groups = await graphService.GetMyMemberOfGroupsAsync(accessToken);
var result = false;
foreach (var group in groups)
{
if (requirement.groups.Equals(group.Id))
{
result = true;
}
}
if (result)
{
context.Succeed(requirement);
}
}
}
А затем с использованием политики:
[Authorize(Policy = "GroupsCheck")]