Azure AD - 检查安全组成员身份 -(Node.js、passport、Azure Web App)

omg*_*_me 2 azure node.js express azure-active-directory passport.js

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

  • 身份验证:由 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}护照中的设置可以解决这个问题,我们启用了会话,但没有运气。

做了一些更多的研究,我发现了这篇文章:如何在 Web 应用程序中从 Azure AD 刷新 ID 令牌?,这表明只能刷新访问令牌,但不能也不应该刷新 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
Run Code Online (Sandbox Code Playgroud)

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

导致以下问题:

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

Ric*_*Web 6

您可以通过passport 一次调用完成,您不需要额外调用其他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
    }
Run Code Online (Sandbox Code Playgroud)