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

时间:2017-06-09 16:07:45

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

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

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

虽然认证部分似乎没有问题,但我们仍然处于授权部分。我们正在使用Express和Passport。

Azure AD将一些令牌转换为req.headers,例如

  • X-MS-令牌-AAD存取令牌
  • X-MS-令牌-AAD刷新令牌
  • X-MS-令牌-AAD-ID-令牌

我们目前正在使用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验证。

导致以下问题:

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

2 个答案:

答案 0 :(得分:1)

除了在ID令牌中检查群组声明外,您还可以致电microsoft graph api以获取该用户所属的群组:

import numpy as np

ourlist = []

for i in range(1, 16):
    ourlist.append(i)


mydata = np.matrix([ourlist])
array_from_list=(mydata.reshape(3, 5))
x_transpose = (np.transpose(array_from_list))

with open('file.txt', 'r') as f:
    lines = f.readlines()

with open('file.txt', 'w') as f:
    i = 0
    for line in lines:
        f.write(str(int(line)) + "  " + str(x_transpose[i])[1:-1][1:-1] + "\n")
        i+=1

或使用Auzre AD Graph api

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

{
  "securityEnabledOnly": true
}

有关如何将App Service Web,Mobile或API应用程序配置为代表已登录用户调用Azure Active Directory图谱API。您可以参考下面的文档,其中显示了详细步骤:

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

在身份验证之后,可以直接从内置请求标头(x-ms-token-aad-access-token)获取访问令牌,您可以发出http请求来调用图api以获取组信息。< / p>

答案 1 :(得分: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”使用其对象ID填充一组组。

因此您可以在req.user._json.groups处获取数组

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