【问题标题】:Azure AD - Check for security group membership - (Node.js, passport, Azure Web App)Azure AD - 检查安全组成员身份 -(Node.js、passport、Azure Web App)
【发布时间】:2017-11-11 17:44:20
【问题描述】:

我们正在尝试设置具有以下要求的身份验证/授权过程:

  • 身份验证:由 Azure AD 完成。
  • 授权:应该只允许特定安全组的成员访问应用程序。

虽然身份验证部分似乎没有问题,但我们仍停留在授权部分。我们正在使用 Express 和 Passport。

Azure AD 一些令牌到req.headers,例如

  • x-ms-token-aad-access-token
  • x-ms-token-aad-refresh-token
  • x-ms-token-aad-id-token

我们目前正在使用 id-token 和 passport-azure-ad BearerStrategy 来检查用户的安全组与允许的安全组。

问题是:一旦 id-token 过期,应用程序将不允许我们访问应用程序。假设在护照中设置{session: true} 可以解决这个问题,我们启用了会话,但没有运气。

做了更多的研究,我发现了这篇文章:How to refresh an ID Token from Azure AD in a Web App?,它指出只有访问令牌可以刷新,但 ID 令牌不能也不应该。

检查x-ms-token-aad-access-tokenx-ms-token-aad-refresh-token,我们发现它们没有JWT结构,例如

    eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1THdqcHdBSk9NOW4tQSJ9.eyJhdWQiOiJodHRwczovL3NlcnZpY2UuY29udG9zby5jb20vIiwiaXNzIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvN2ZlODE0NDctZGE1Ny00Mzg1LWJlY2ItNmRlNTdmMjE0NzdlLyIsImlhdCI6MTM4ODQ0MDg2MywibmJmIjoxMzg4NDQwODYzLCJleHAiOjEzODg0NDQ3NjMsInZlciI6IjEuMCIsInRpZCI6IjdmZTgxNDQ3LWRhNTctNDM4NS1iZWNiLTZkZTU3ZjIxNDc3ZSIsIm9pZCI6IjY4Mzg5YWUyLTYyZmEtNGIxOC05MWZlLTUzZGQxMDlkNzRmNSIsInVwbiI6ImZyYW5rbUBjb250b3NvLmNvbSIsInVuaXF1ZV9uYW1lIjoiZnJhbmttQGNvbnRvc28uY29tIiwic3ViIjoiZGVOcUlqOUlPRTlQV0pXYkhzZnRYdDJFYWJQVmwwQ2o4UUFtZWZSTFY5OCIsImZhbWlseV9uYW1lIjoiTWlsbGVyIiwiZ2l2ZW5fbmFtZSI6IkZyYW5rIiwiYXBwaWQiOiIyZDRkMTFhMi1mODE0LTQ2YTctODkwYS0yNzRhNzJhNzMwOWUiLCJhcHBpZGFjciI6IjAiLCJzY3AiOiJ1c2VyX2ltcGVyc29uYXRpb24iLCJhY3IiOiIxIn0.JZw8jC0gptZxVC-7l5sFkdnJgP3_tRjeQEPgUn28XctVe3QqmheLZw7QVZDPCyGycDWBaqy7FLpSekET_BftDkewRhyHk9FW_KeEz0ch2c3i08NGNDbr6XYGVayNuSesYk5Aw_p3ICRlUV1bqEwk-Jkzs9EEkQg4hbefqJS6yS1HoV_2EsEhpd_wCQpxK89WPs3hLYZETRJtG5kvCCEOvSHXmDE6eTHGTnEgsIk--UlPe275Dvou4gEAwLofhLDQbMSjnlV5VLsjimNBVcSRFShoxmQwBJR_b2011Y5IuD6St5zPnzruBbZYkGNurQK63TJPWmRd3mbJsGM0mf3CUQ

它们不包含任何点,因此未通过 JWT 验证。

导致以下问题:

  • 根据指定的允许安全组检查用户的安全组的正确方法是什么?

【问题讨论】:

  • 提示:你应该看看 Graph API
  • 谢谢,我们看看!

标签: node.js azure express passport.js azure-active-directory


【解决方案1】:

您可以通过护照在一次调用中完成,您不需要对其他 api 层进行额外调用,因为接缝会在多个在线帖子中建议。使用 v2 端点并定义范围,您可以选择您有权访问的内容以及您在令牌中收到的内容。包括安全组在内的某些选项确实需要您修改清单,请参见下文。

在您的 Azure Active Directory 中,转到您正在使用身份验证用户的应用程序注册。在该应用注册的清单中,将 groupMembershipClaims 从 null 更改为“SecurityGroup”或“All”(如果要包括办公室组等)。

{ "id": "some-id", "accessTokenAcceptedVersion": null, "allowPublicClient": false, "appId": "some-id", "appRoles": [], "oauth2AllowUrlPathMatching": false, "createdDateTime": "2018-11-15T17:49:23Z", "groupMembershipClaims": "SecurityGroup", "identifierUris": [ ...............

然后,它使用对象 ID 使用组的数组填充 Groups 字段。

所以你可以在 req.user._json.groups 获取数组

   if (req.user._json.groups.indexOf('some-group-Object-ID') > -1) {
        //In Group
    } else {
        //Not in Group
    }

【讨论】:

【解决方案2】:

除了检查 ID 令牌中的组声明之外,您还可以调用 microsoft graph api 来获取用户是直接成员的组:

POST https://graph.microsoft.com/beta/me/getMemberGroups
Content-type: application/json
Content-length: 33

{
  "securityEnabledOnly": true
}

或者使用Auzre AD Graph api

POST https://graph.windows.net/myorganization/{resource_collection}/{resource_id}/getMemberGroups?api-version
Content-Type: application/json
{
  "securityEnabledOnly": false
}

了解如何将应用服务 Web、移动或 API 应用配置为代表登录用户调用 Azure Active Directory Graph API。您可以参考以下显示详细步骤的文档:

https://cgillum.tech/2016/03/25/app-service-auth-aad-graph-api/

身份验证后,可以直接从内置请求头(x-ms-token-aad-access-token)中获取访问令牌,您可以发出http请求调用graph api获取组信息。

【讨论】:

  • 我们会调查的。感谢您提供所有信息和示例!
  • @omg_me 等待反馈,如果回复有帮助,您可以将其标记为答案,这可能会帮助遇到同样问题的其他人。
猜你喜欢
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-23
  • 1970-01-01
相关资源
最近更新 更多