Если вы хотите настроить приложение для получения групповых заявок, вам нужно установить значение " groupMembershipClaims " как SecurityGroup
в файле манифеста.
На странице настроек приложения на портале регистрации приложений нажмите «Манифест», чтобы открыть встроенный редактор манифеста.
Редактирование манифестапутем выбора параметра «groupMembershipClaims» и установки его значения в «SecurityGroup».
Сохраните манифест.
{
...
"errorUrl": null,
"groupMembershipClaims": "SecurityGroup",
...
}
Когдагрупповое утверждение включено для приложения, Azure AD включает в токены JWT и SAML утверждение, содержащее идентификаторы объектов (objectId) всех групп, к которым принадлежит пользователь, включая транзитивное членство в группах.
Но учтите, что для того, чтобы размер токена не превышал ограничения размера заголовка HTTP, Azure AD ограничивает количество идентификаторов объектов, включаемых в утверждение групп. Если пользователь является участником большего числа групп, чем предел превышения (150 для токенов SAML, 200 для токенов JWT), то Azure AD не отправляет утверждение группы в токене. Вместо этого он включает избыточное требование в токене, которое указывает приложению на запрос API Graph для получения членства в группе пользователя. Для получения более подробной информации, пожалуйста, обратитесь к блогу .
Так что вам нужно выполнить какой-то процесс:
Проверьте наличие в заявке _claim_names с одним из значений, являющихся группами. Это указывает на переизбыток.
Если найден, вызовите конечную точку, указанную в _claim_sources, чтобы получить группы пользователей.
Если ничего не найдено, посмотритев группы претензий для групп пользователей.
Конечно, вы можете напрямую позвонить Microsoft Graph API , чтобы удалить группы текущего пользователя без используя group claims
Что касается авторизации на основе этих групп, вы можете создать политику. Для получения более подробной информации, пожалуйста, обратитесь к документу . Например,
Startup.cs
services.AddAuthorization(options =>
{
options.AddPolicy("CheckGroups", 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 = "CheckGroups")]
Кроме того, вы также можете реализовать его с помощью библиотек промежуточного программного обеспечения ASP.NET Core. Промежуточное программное обеспечение asp.net поддерживает роли, заполненные утверждениями, указав утверждение в свойстве RoleClaimType
TokenValidationParameters
. Поскольку утверждение groups
содержит идентификаторы объектов групп безопасности, а не фактические имена, вместо имен групп следует использовать идентификаторы групп. Для более подробной информации, пожалуйста, обратитесь к sample .
Startup.cs
// The following lines code instruct the asp.net core middleware to use the data in the "groups" claim in the Authorize attribute and User.IsInrole()
// See https://docs.microsoft.com/en-us/aspnet/core/security/authorization/roles?view=aspnetcore-2.2 for more info.
services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
{
// Use the groups claim for populating roles
options.TokenValidationParameters.RoleClaimType = "groups";
});
Затем с его помощью
[Authorize(Roles = “Group-object-id")] // In controllers
// or
User.IsInRole("Group-object-id"); // In methods