如果您想将应用程序配置为接收群组声明,则需要设置“团体会员声明 https://learn.microsoft.com/en-us/azure/active-directory/develop/reference-app-manifest#manifest-reference“ 价值为SecurityGroup
在清单文件中。
在应用程序注册门户的应用程序设置页面中,单击“清单”以打开内联清单编辑器。
通过找到“groupMembershipClaims”设置并将其值设置为“SecurityGroup”来编辑清单。
保存清单。
{
...
"errorUrl": null,
"groupMembershipClaims": "SecurityGroup",
...
}
为应用程序启用组声明后,Azure AD 会在 JWT 和 SAML 令牌中包含一个声明,其中包含用户所属的所有组的对象标识符 (objectId),包括可传递的组成员身份。
但请注意,要确保token大小不超过HTTP
标头大小限制,Azure AD 限制其所包含的 objectId 数量
包括在团体索赔中。如果用户属于多个组的成员
超额限制(SAML 令牌为 150,JWT 令牌为 200),然后
Azure AD 不会发出令牌中的组声明。相反,它
在令牌中包含超额声明,表明
应用程序查询 Graph API 以检索用户组
会员资格。欲了解更多详情,请参阅blog https://techcommunity.microsoft.com/t5/Azure-Active-Directory-Identity/Azure-Active-Directory-now-with-Group-Claims-and-Application/ba-p/243862.
所以你需要做一些过程:
检查声明 _claim_names 的值之一是否为组。这表明超额。
如果找到,则调用 _claim_sources 中指定的端点来获取用户组。
如果没有找到,请查看用户组的组声明。
当然,你也可以直接调用停用当前用户组without using group claims
关于如何基于该组进行授权,您可以创建一个策略。欲了解更多详情,请参阅document https://learn.microsoft.com/en-us/aspnet/core/security/authorization/policies?view=aspnetcore-2.2。例如
启动.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
声明包含安全组的对象 ID,而不是实际名称,因此您可以使用组 ID 而不是组名称。欲了解更多详情,请参阅sample https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2/tree/master/5-WebApp-AuthZ/5-2-Groups.
启动.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://learn.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