针对 Azure AD 组的 Asp .net 核心应用授权

时间:2021-01-11 13:37:02

标签: azure asp.net-core azure-active-directory

我有一个 .net core 2.0 服务,我正在尝试通过从 AAD 读取组来实现授权

做了什么:

  1. 在 Azure 门户的应用注册中,修改清单 - 添加了“groupMembershipClaims”:“SecurityGroup”
  2. 在应用注册 -> API 权限 -> 授予权限

Permissions

在代码中:

   public static class AuthorizationPolicy
    {
        public static string Name => "GroupName";

        public static void Build(AuthorizationPolicyBuilder builder) =>
            builder.RequireClaim("GroupName", "06edc7ed-b0da-425f-b4a3-f501904e6c6f");
    }

services.AddAuthorization(options => { options.AddPolicy("GroupName", policy => policy.AddRequirements(new IsMemberOfGroupRequirement("GroupName", "06edc7ed-b0da-425f-b4a3-f501904e6c6f"))); });

添加了 AuthorizationHandler 类

public class IsMemberOfGroupHandler : AuthorizationHandler<IsMemberOfGroupRequirement>
{
    protected override Task HandleRequirementAsync(
        AuthorizationHandlerContext context, IsMemberOfGroupRequirement requirement)
    {
        var groupClaim = context.User.Claims
            .FirstOrDefault(claim => claim.Type == "groups" &&
                                     claim.Value.Equals(requirement.GroupId, StringComparison.InvariantCultureIgnoreCase));

        if (groupClaim != null)
            context.Succeed(requirement);

        return Task.CompletedTask;
    }
}

但是用户的声明中不存在这些组

请帮忙,我缺少什么

1 个答案:

答案 0 :(得分:0)

您注册的应用似乎用于请求图形 API。因此,访问令牌中不存在 groups 声明。

以下是我们需要了解的有关 groups 声明的信息:

如果我们在 AD 中将一个应用注册为 clientApp,并在 AD 中将另一个应用(用于 web 应用或 api 应用)注册为 backendApp。然后将backendApp的权限添加到clientApp中,根据clientApp请求访问令牌。现在,如果您在 backendApp 的清单中添加 groups,访问令牌将包含 "groupMembershipClaims": "SecurityGroup" 声明。 我们可以根据他的组限制用户可以/不能对backendApp进行任何操作(因为backendApp(webapp or api app)是属于我们的

但是如果您在 AD 中将应用程序注册为 clientApp 以请求图形 api 的令牌,则图形 api backendApp 不属于我们,它只是在 AD 中存在图形 api 的企业应用程序。所以我们不能修改它的清单。因此访问令牌不包含 groups 声明。实际上,由于graph api不属于使用范围,因此限制用户可以/不能按组进行任何操作是没有意义的

所以问题出在设计上。如果您仍想获取 groups cliam,可以在“id_token”中获取。在“scope”中添加一个openid,那么响应将包含“id_token”。在this页面解码“id_token”,可以找到groups声明。 enter image description here