【问题标题】:Asp .net core app authorization against Azure AD groups针对 Azure AD 组的 Asp .net 核心应用授权
【发布时间】:2021-04-16 10:57:47
【问题描述】:

我有一个 .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;
    }
}

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

请帮忙,我错过了什么

【问题讨论】:

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


    【解决方案1】:

    您注册的应用似乎用于请求图形 api。所以groups 声明在访问令牌中不存在。

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

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

    但是如果你在AD中注册应用程序为clientApp来请求graph api的token,graph api backendApp不属于我们,它只是在AD中存在一个用于graph api的企业应用程序。所以我们不能修改它的清单。所以访问令牌不包含groups 声明。实际上,由于graph api不属于使用,所以限制用户可以/不能根据他的组进行任何操作是没有意义的

    所以问题是设计使然。如果你还想得到groupscliam,你可以在“id_token”中得到它。在“范围”中添加openid,则响应将包含“id_token”。解码this页面中的“id_token”,可以找到groups声明。

    【讨论】:

    • 注册一个应用为客户端或后端是什么意思,有什么区别?在哪里可以选择注册应用的模式?
    • 嗨@StasMashkovich您在描述中What was done:中提到的注册应用程序是客户端应用程序,图形是后端应用程序(在您的情况下,您不需要在AD中注册后端应用程序) .正如我在回答中提到的,在您的情况下,访问令牌不包含 groups 声明,这是设计使然。
    • @StasMashkovich 如果我的回答对您的问题有所帮助,请accept 将其作为答案(单击我的答案旁边的复选标记,将其从灰色切换为已填充)。先谢谢了~
    猜你喜欢
    • 1970-01-01
    • 2018-02-13
    • 2022-11-05
    • 2018-03-13
    • 2020-08-24
    • 2020-02-16
    • 1970-01-01
    • 2022-10-13
    • 2020-03-19
    相关资源
    最近更新 更多