【问题标题】:How to check caller is part of AD Security group in WebAPI layer?如何检查调用者是 WebAPI 层中 AD 安全组的一部分?
【发布时间】:2018-09-17 03:40:49
【问题描述】:

我有一个网站 (WebApp),我从该网站对接受 JWT Bearer Token 身份验证的 WebAPI 层进行 Ajax 调用。我已将 Adal.js 集成到我的前端脚本层中,配置值如下所示。

var config = {
instance: "https://login.microsoftonline.com/",
tenant: "tenant.com",
clientId: "CLIENT_ID OF THE PORTAL APP", // Web-Portal app
redirectUri: "http://localhost:8241/",
popUp: true,
cacheLocation: "localStorage" };

WebApiConfig 如下所示:

var webApiConfig = {
    resourceId: "CLIENT_ID OF API APP", // Web-API app
    resourceBaseAddress: "http://localhost:9020/"
};

一切正常,我能够通过隐式 oauth 流通过访问令牌进行身份验证/授权和调用我的 webapi。

现在我希望能够检索登录用户的用户安全组成员资格值,以便 在 WebAPI 层,我可以确保用户属于特定的安全组授权逻辑的一部分。因此,我在 Azure AD 的应用程序清单 xml 中设置了 GroupMembershipClaims: "SecurityGroup"(我首先为 WebApi 应用程序清单执行此操作,然后也在 WebApp 应用程序清单中执行此操作)。

但是,GroupMembershipClaims 似乎只包含在 idtoken 中, 包含在 accessToken 中。鉴于它是发送到 WebAPI 的 accessToken,我无法在该层进行此检查。我想我可以在 WebApp 层进行检查,但鉴于此 WebApi 层将从许多其他前端应用程序(不属于我所有,我主要是“API 提供者”)调用,这不是一个安全的解决方案。

那么我该如何解决呢?我想一种方法是使用 WebApi 层上的“代表”流来调用 Graph API 来找出答案?恐怕这将需要比用户范围内更多的权限。

谢谢!

【问题讨论】:

    标签: asp.net-web-api oauth-2.0 authorization azure-active-directory adal.js


    【解决方案1】:

    这是个好问题。

    我的第一个想法是“你可以从 Graph API 获取它们”,但我看到你已经想到了 :)

    如果你想这样做,你可以像你说的那样使用 On-behalf-of,并在 MS Graph API 上使用这个操作:https://developer.microsoft.com/en-us/graph/docs/api-reference/beta/api/user_getmembergroups。 您将需要这些委派权限:User.Read 和 Group.Read.All。 因此,除了基本的 User.Read 之外,您还需要读取所有组的权限。

    还有其他几个选项。

    您可以在 API 中定义角色。 我写了一篇关于如何做到这一点的文章:Defining permission scopes and roles offered by an app in Azure AD。 因此,如果您在 API 的清单中定义这样的角色:

    {
      "appRoles": [
        {
          "allowedMemberTypes": [
            "User"
          ],
          "displayName": "Administrator",
          "id": "179c1dc0-4801-46f3-bc0d-35f059da1415",
          "isEnabled": true,
          "description": "Administrators can access advanced features.",
          "value": "admin"
        }
      ]
    }
    

    您需要将 id 设置为每个角色的唯一 GUID,您可以使用在线生成器或 PowerShell 为该[System.Guid]::NewGuid()

    然后可以将这些角色分配给用户,如果您至少有 Azure AD Basic,则可以将它们分配给组。 角色包含在访问令牌中,因此您可以在 API 中轻松检查这些。

    我的另一个想法是让 API 和前端在 Azure AD 中使用相同的注册应用。 这样,您可以将 Id 令牌而不是访问令牌传递给 API,并且您将获得组。 但由于您可能还有其他前端,我怀疑这是否适合您。

    【讨论】:

    • 谢谢。我查看了您的博客,这对我来说似乎是一个很好的解决方案 - 使用角色(至少一开始是用户类型)将特定的用户主体(我想甚至是 AD sec 组)分配给给定的应用程序角色。并在我的 WebAPI 上验证这一点,因为这将在访问令牌中。但是,当我尝试使用它时,我发现为了将 到企业应用程序,我需要全局管理员权限! (见docs.microsoft.com/en-us/azure/active-directory/…)。对这个发现感到非常失望:(
    • 哎哟。不记得那个了。希望您可以分配组,这样您就不必再次接触分配。
    • 关于您的其他 2 条建议:1) 访问 Graph API(从 WebAPI 层)需要 Group.Read.All - 这实际上需要 AD Admin Consent,我不确定我的组织的管理员是否会授予. (我们是一家大型公司) 2)在授权时为客户端和 WebAPI 使用 WebAPI client_id - 我简要地考虑了这一点,但这是一个 hack,我认为这可能会带来麻烦。无论哪种方式,看起来我的全球管理员都需要参与其中。
    • 是的,因此,如果您拥有 AAD Basic 或任何付费许可证,您可以将安全组分配给应用角色。通过这种方式给用户角色,您只需要将他们添加到组中。我认为这样做会更容易:)
    • 让我的全球管理员参与其中;他们建议与 juunas 所做的相同 - 为用户和应用程序添加一个新的 AppRole,然后他们帮助将一个 AD sec 组(新创建的)添加到企业应用程序“用户和组”列表中。通过此设置,我已确认 1) 我的访问令牌包含“角色”声明,以及 2) 在我的 WebAPI 层中,我可以使用 [Authorize(Roles="Administrator")] 之类的属性装饰并且它可以正常工作。要编写的代码少了很多,而且我的访问权限是通过良好的 AD 安全组控制的。
    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 2021-09-15
    • 2012-08-15
    • 1970-01-01
    相关资源
    最近更新 更多