使用访问评审 API 查看对安全组的访问权限

Microsoft Graph 中的访问评审 API 使组织能够审核和证明身份 (也称为 主体) 分配给组织中的资源的访问权限。 可以使用安全组有效地管理对组织中资源的访问。 例如,访问包含营销 playbook 的 SharePoint 网站。 通过使用访问评审 API,组织可以定期证明有权访问此类组的主体,并按扩展证明组织中的资源。

在本教程中,你将了解如何:

  • 创建安全组成员身份的定期访问评审。
  • 自我证明需要维护对组的访问。

先决条件

若要完成本教程,需要以下资源和特权:

  • 启用了 Microsoft Entra ID P2 或 Microsoft Entra ID 治理 许可证的工作Microsoft Entra租户。
  • 租户中的两个测试来宾和一个测试安全组。 来宾应是组的成员,并且组应至少有一个所有者。
  • 登录到 API 客户端(如 Graph 资源管理器), 使用至少具有 标识治理管理员 角色的帐户调用 Microsoft Graph。
    • [可选]打开新的 隐身浏览器窗口、 匿名浏览器窗口或 InPrivate 浏览器 窗口。 稍后将在本教程中登录。
  • 授予自己以下委托的权限: AccessReview.ReadWrite.All

注意

对受 PIM 管理的组的评审仅将活动所有者分配为审阅者。 不包括符合条件的所有者。 至少需要一个回退审阅者才能对受 PIM 管理的组进行访问评审。 如果在评审开始时没有活动所有者,则为回退审阅者分配评审。

步骤 1:为安全组创建访问评审

请求

在此调用中,替换以下值:

  • eb75ccd2-59ef-48b7-8f76-cc3f33f899f4 替换为安全组的 ID。
  • startDate 的值(包含今天的日期)和 endDate 的值(包含开始日期五天后的日期)。

访问评审具有以下设置:

  • 如果未为审阅者属性指定值,则这是推断的自我证明 评审 。 因此,每个组成员都自我证明他们需要保持对组的访问权限。
  • 评审的范围是组的直接成员和可传递成员。
  • 审阅者必须提供理由说明为什么他们需要保持对组的访问权限。
  • 默认决策是 Deny 审阅者在实例过期之前不响应访问评审请求。 该 Deny 决策会从组中删除组成员。
  • 这是一次性访问评审,在五天后结束。 因此,授予访问权限后,用户无需在访问评审期内再次自我证明。
  • 在评审范围内定义的主体会收到电子邮件通知和提醒,提示他们自行证明需要维护访问权限。
POST https://graph.microsoft.com/v1.0/identityGovernance/accessReviews/definitions
Content-type: application/json

{
    "displayName": "One-time self-review for members of Building security",
    "descriptionForAdmins": "One-time self-review for members of Building security",
    "descriptionForReviewers": "One-time self-review for members of Building security",
    "scope": {
        "query": "/groups/eb75ccd2-59ef-48b7-8f76-cc3f33f899f4/transitiveMembers",
        "queryType": "MicrosoftGraph"
    },
    "instanceEnumerationScope": {
        "query": "/groups/eb75ccd2-59ef-48b7-8f76-cc3f33f899f4",
        "queryType": "MicrosoftGraph"
    },
    "settings": {
        "mailNotificationsEnabled": true,
        "reminderNotificationsEnabled": true,
        "justificationRequiredOnApproval": true,
        "defaultDecisionEnabled": true,
        "defaultDecision": "Deny",
        "instanceDurationInDays": 5,
        "autoApplyDecisionsEnabled": true,
        "recommendationsEnabled": true,
        "recurrence": {
            "pattern": null,
            "range": {
                "type": "numbered",
                "numberOfOccurrences": 0,
                "recurrenceTimeZone": null,
                "startDate": "2024-03-21",
                "endDate": "2024-03-30"
            }
        }
    }
}

响应

访问评审的状态为 NotStarted。 可以检索访问评审 (GET https://graph.microsoft.com/v1.0/identityGovernance/accessReviews/definitions/2d56c364-0695-4ec6-8b92-4c1db7c80f1b) 监视状态,当其状态为 InProgress 时,已为访问评审创建了实例,并且可以发布决策。 还可以检索访问评审以查看其完整设置。

注意:为了提高可读性,可能缩短了此处显示的响应对象。

HTTP/1.1 201 Created
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#identityGovernance/accessReviews/definitions/$entity",
    "id": "2d56c364-0695-4ec6-8b92-4c1db7c80f1b",
    "displayName": "One-time self-review for members of Building security",
    "createdDateTime": null,
    "lastModifiedDateTime": null,
    "status": "NotStarted",
    "descriptionForAdmins": "One-time self-review for members of Building security",
    "descriptionForReviewers": "One-time self-review for members of Building security",
    "scope": {},
    "instanceEnumerationScope": {},
    "reviewers": [],
    "fallbackReviewers": [],
    "settings": {
        "mailNotificationsEnabled": true,
        "reminderNotificationsEnabled": true,
        "justificationRequiredOnApproval": true,
        "defaultDecisionEnabled": true,
        "defaultDecision": "Deny",
        "instanceDurationInDays": 5,
        "autoApplyDecisionsEnabled": true,
        "recommendationsEnabled": true,
        "recommendationLookBackDuration": null,
        "decisionHistoriesForReviewersEnabled": false,
        "recurrence": {
            "pattern": null,
            "range": {
                "type": "numbered",
                "numberOfOccurrences": 0,
                "recurrenceTimeZone": null,
                "startDate": "2024-03-21",
                "endDate": "2024-03-30"
            }
        },
        "applyActions": [],
        "recommendationInsightSettings": []
    },
    "stageSettings": [],
    "additionalNotificationRecipients": []
}

步骤 2:列出访问评审的实例

将访问评审 的状态 标记为 InProgress后,运行以下查询以列出访问评审定义的所有实例。 由于在上一步中创建了一次性访问评审,因此请求仅返回一个 ID 为计划定义的 ID 的实例。

请求

GET https://graph.microsoft.com/v1.0/identityGovernance/accessReviews/definitions/2d56c364-0695-4ec6-8b92-4c1db7c80f1b/instances

响应

在此响应中,实例的状态InProgress,因为 startDateTime 已过去,endDateTime 在将来。 如果 startDateTime 在将来,则状态为 NotStarted。 另一方面,如果 endDateTime 是过去,则状态为 Completed

注意:为了提高可读性,可能缩短了此处显示的响应对象。

HTTP/1.1 200 OK
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#identityGovernance/accessReviews/definitions('2d56c364-0695-4ec6-8b92-4c1db7c80f1b')/instances",
    "value": [
        {
            "id": "2d56c364-0695-4ec6-8b92-4c1db7c80f1b",
            "startDateTime": "2024-03-21T17:35:25.24Z",
            "endDateTime": "2024-03-30T08:00:00Z",
            "status": "InProgress",
            "scope": {
                "@odata.type": "#microsoft.graph.accessReviewQueryScope",
                "query": "/v1.0/groups/eb75ccd2-59ef-48b7-8f76-cc3f33f899f4/transitiveMembers/microsoft.graph.user",
                "queryType": "MicrosoftGraph",
                "queryRoot": null
            },
            "reviewers": [],
            "fallbackReviewers": []
        }
    ]
}

步骤 3:验证已联系谁进行评审

可以确认是否已联系安全组的所有成员,以发布针对此访问评审实例的评审决定。

请求

GET https://graph.microsoft.com/v1.0/identityGovernance/accessReviews/definitions/2d56c364-0695-4ec6-8b92-4c1db7c80f1b/instances/2d56c364-0695-4ec6-8b92-4c1db7c80f1b/contactedReviewers

响应

以下响应显示,安全组的两个成员收到其待审核通知。

注意:为了提高可读性,可能缩短了此处显示的响应对象。

HTTP/1.1 200 OK
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#identityGovernance/accessReviews/definitions('2d56c364-0695-4ec6-8b92-4c1db7c80f1b')/instances('2d56c364-0695-4ec6-8b92-4c1db7c80f1b')/contactedReviewers",
    "@odata.count": 2,
    "value": [
        {
            "id": "3b8ceebc-49e6-4e0c-9e14-c906374a7ef6",
            "displayName": "Adele Vance",
            "userPrincipalName": "AdeleV@Contoso.com",
            "createdDateTime": "2024-03-21T17:35:34.4092545Z"
        },
        {
            "id": "bf59c5ba-5304-4c9b-9192-e5a4cb8444e7",
            "displayName": "Alex Wilber",
            "userPrincipalName": "AlexW@Contoso.com",
            "createdDateTime": "2024-03-21T17:35:34.4092545Z"
        }
    ]
}

步骤 4:获取决策

你对访问评审实例的决策感兴趣。

请求

GET https://graph.microsoft.com/v1.0/identityGovernance/accessReviews/definitions/2d56c364-0695-4ec6-8b92-4c1db7c80f1b/instances/2d56c364-0695-4ec6-8b92-4c1db7c80f1b/decisions

响应

以下响应显示了对评审实例做出的决策。 由于安全组有两个成员,因此需要两个决策项。

注意:为了提高可读性,可能缩短了此处显示的响应对象。

HTTP/1.1 200 OK
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#identityGovernance/accessReviews/definitions('2d56c364-0695-4ec6-8b92-4c1db7c80f1b')/instances('2d56c364-0695-4ec6-8b92-4c1db7c80f1b')/decisions",
    "@odata.count": 2,
    "value": [
        {
            "id": "4db68765-472d-4aa2-847a-433ea94bcfaf",
            "accessReviewId": "2d56c364-0695-4ec6-8b92-4c1db7c80f1b",
            "reviewedDateTime": null,
            "decision": "NotReviewed",
            "justification": "",
            "appliedDateTime": null,
            "applyResult": "New",
            "recommendation": "Approve",
            "principalLink": "https://graph.microsoft.com/v1.0/users/bf59c5ba-5304-4c9b-9192-e5a4cb8444e7",
            "resourceLink": "https://graph.microsoft.com/v1.0/groups/eb75ccd2-59ef-48b7-8f76-cc3f33f899f4",
            "reviewedBy": {
                "id": "00000000-0000-0000-0000-000000000000",
                "displayName": "",
                "type": null,
                "userPrincipalName": ""
            },
            "appliedBy": {
                "id": "00000000-0000-0000-0000-000000000000",
                "displayName": "",
                "type": null,
                "userPrincipalName": ""
            },
            "resource": {
                "id": "eb75ccd2-59ef-48b7-8f76-cc3f33f899f4",
                "displayName": "Building security",
                "type": "group"
            },
            "principal": {
                "@odata.type": "#microsoft.graph.userIdentity",
                "id": "bf59c5ba-5304-4c9b-9192-e5a4cb8444e7",
                "displayName": "Alex Wilber",
                "type": "user",
                "userPrincipalName": "AlexW@Contoso.com",
                "lastUserSignInDateTime": "2/11/2022 5:31:37 PM +00:00"
            }
        },
        {
            "id": "c7de8fba-4d6a-4fab-a659-62ff0c02643d",
            "accessReviewId": "2d56c364-0695-4ec6-8b92-4c1db7c80f1b",
            "reviewedDateTime": null,
            "decision": "NotReviewed",
            "justification": "",
            "appliedDateTime": null,
            "applyResult": "New",
            "recommendation": "Approve",
            "principalLink": "https://graph.microsoft.com/v1.0/users/3b8ceebc-49e6-4e0c-9e14-c906374a7ef6",
            "resourceLink": "https://graph.microsoft.com/v1.0/groups/eb75ccd2-59ef-48b7-8f76-cc3f33f899f4",
            "reviewedBy": {
                "id": "00000000-0000-0000-0000-000000000000",
                "displayName": "",
                "type": null,
                "userPrincipalName": ""
            },
            "appliedBy": {
                "id": "00000000-0000-0000-0000-000000000000",
                "displayName": "",
                "type": null,
                "userPrincipalName": ""
            },
            "resource": {
                "id": "eb75ccd2-59ef-48b7-8f76-cc3f33f899f4",
                "displayName": "Building security",
                "type": "group"
            },
            "principal": {
                "@odata.type": "#microsoft.graph.userIdentity",
                "id": "3b8ceebc-49e6-4e0c-9e14-c906374a7ef6",
                "displayName": "Adele Vance",
                "type": "user",
                "userPrincipalName": "AdeleV@Contoso.com",
                "lastUserSignInDateTime": "2/11/2022 4:58:13 PM +00:00"
            }
        }
    ]
}

在调用中, 决策 属性的值为 , NotReviewed 因为组成员尚未完成其自我证明。 下一步演示每个成员如何自我证明其访问评审需求。

步骤 5:自我证明挂起的访问决策

你已将访问评审配置为自我证明。 此配置要求组的两个成员都自我证明他们需要保持对组的访问权限。

注意

作为安全组的两个成员之一完成此步骤。

在此步骤中,将列出挂起的访问评审,然后完成自我证明过程。 可以通过以下两种方式之一完成此步骤:使用 API 或使用 “我的访问权限”门户。 其他审阅者不会进行自我证明,而是将默认决策应用于其访问评审。

启动新的 incognito匿名InPrivate 浏览 浏览器会话,并作为安全组的两个成员之一登录。 这样做不会中断当前管理员会话。 或者,可以通过注销 Graph 资源管理器并作为两个组成员之一重新登录来中断当前管理员会话。

方法 1:使用访问评审 API 对挂起的访问进行自我评审

列出访问评审决策项

请求
GET https://graph.microsoft.com/v1.0/identitygovernance/accessReviews/definitions/2d56c364-0695-4ec6-8b92-4c1db7c80f1b/instances/2d56c364-0695-4ec6-8b92-4c1db7c80f1b/decisions/filterByCurrentUser(on='reviewer')
响应

从响应中,你 (Adele Vance) 有一个挂起的访问评审, (决定) NotReviewed 自我证明。 主体和资源属性指示决策适用的主体以及正在审查其访问权限的资源。 在本例中,Adele Vance 和安全组分别。

注意:为了提高可读性,可能缩短了此处显示的响应对象。

HTTP/1.1 200 OK
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#Collection(accessReviewInstanceDecisionItem)",
    "@odata.count": 1,
    "value": [
        {
            "@odata.type": "#microsoft.graph.accessReviewInstanceDecisionItem",
            "id": "c7de8fba-4d6a-4fab-a659-62ff0c02643d",
            "accessReviewId": "2d56c364-0695-4ec6-8b92-4c1db7c80f1b",
            "reviewedDateTime": null,
            "decision": "NotReviewed",
            "justification": "",
            "appliedDateTime": null,
            "applyResult": "New",
            "recommendation": "Approve",
            "principalLink": "https://graph.microsoft.com/v1.0/users/3b8ceebc-49e6-4e0c-9e14-c906374a7ef6",
            "resourceLink": "https://graph.microsoft.com/v1.0/groups/eb75ccd2-59ef-48b7-8f76-cc3f33f899f4",
            "reviewedBy": {
                "id": "00000000-0000-0000-0000-000000000000",
                "displayName": "",
                "type": null,
                "userPrincipalName": ""
            },
            "appliedBy": {
                "id": "00000000-0000-0000-0000-000000000000",
                "displayName": "",
                "type": null,
                "userPrincipalName": ""
            },
            "resource": {
                "id": "eb75ccd2-59ef-48b7-8f76-cc3f33f899f4",
                "displayName": "Building security",
                "type": "group"
            },
            "principal": {
                "@odata.type": "#microsoft.graph.userIdentity",
                "id": "3b8ceebc-49e6-4e0c-9e14-c906374a7ef6",
                "displayName": "Adele Vance",
                "type": "user",
                "userPrincipalName": "AdeleV@Contoso.com",
                "lastUserSignInDateTime": "2/15/2022 9:35:23 AM +00:00"
            }
        }
    ]
}

记录决策

为了完成访问评审,Adele Vance 确认需要保持对安全组的访问权限。

请求会返回 204 No Content 响应代码。

PATCH https://graph.microsoft.com/v1.0/identitygovernance/accessReviews/definitions/2d56c364-0695-4ec6-8b92-4c1db7c80f1b/instances/2d56c364-0695-4ec6-8b92-4c1db7c80f1b/decisions/c7de8fba-4d6a-4fab-a659-62ff0c02643d

{
    "decision": "Approve",
    "justification": "As the assistant security manager, I still need access to the building security group."
}

验证决策

若要验证为访问评审记录的决策, 请列出访问评审决策项。 虽然访问评审期尚未过期,也没有应用决策, 但 applyResult 将标记为 New ,并允许你更改决策。

现在可以注销并退出 incognito 浏览器会话。

方法 2:使用“我的访问”门户

或者,可以通过“我的访问”门户门户检查挂起的访问评审实例。

  • 列出挂起的访问评审。 用户可以按照以下两种方法之一实现此目的:

    • 选项 1:从邮件收件箱中收到的电子邮件通知中选择“ 查看访问 ”按钮。 电子邮件通知类似于以下屏幕截图。 此按钮是指向挂起访问评审的直接链接。

    Email通知查看访问权限。

    • 选项 2:转到 “我的访问”门户 。 选择“ 访问评审 ”菜单,然后选择“ 组和应用 ”选项卡。
  • 从访问评审列表中,选择要发布决策的访问评审。 选择“ ”发布仍需要访问 “构建安全性”的决定。 输入原因,然后选择“ 提交”。

    自我证明需要维护对资源的访问。

现在可以注销并退出 incognito 浏览器会话。

步骤 6:确认访问评审的决策和状态

返回到仍使用管理员权限登录的main浏览器会话中,重复步骤 4 以查看 Adele Vance 的决策属性现在Approve为 。 访问评审结束或过期时,将记录 Alex Wilber 的默认决策 Deny 。 然后自动应用决策,因为 autoApplyDecisionsEnabled 设置为 true ,并且访问评审实例的时间段已结束。 当 Alex 自动从组中删除时,Adele 会保持对安全组的访问权限。

祝贺你! 你创建了访问评审,并自我证明了维护访问权限的需求。 你只进行了一次自我证明,并且将保留你的访问权限,直到通过另一个访问评审实例的决策或通过另一 Deny 个内部进程将其删除。

第 7 步:清理资源

在此调用中,将删除访问评审定义。 由于访问评审计划定义是访问评审的蓝图,因此删除该定义会删除相关的设置、实例和决策。

请求会返回 204 No Content 响应代码。

DELETE https://graph.microsoft.com/beta/identityGovernance/accessReviews/definitions/2d56c364-0695-4ec6-8b92-4c1db7c80f1b

总结

你创建了一个访问评审,其中主体自行证明他们需要维护对资源(在本例中为 “生成安全组 ”)的访问权限。

本教程演示了Microsoft Entra访问评审 API 的方案之一。 访问评审 API 通过资源、主体和审阅者的组合支持不同的方案,以满足访问证明需求。 有关详细信息,请参阅 访问评审 API