You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于AWS Lambda与Azure AD SSO自动清理第三方应用失效用户方案咨询

问题解决方案与评价

方案评价

方案1:AWS Lambda直接清理第三方应用失效用户

  • 优势:不依赖第三方应用的SCIM支持,直接调用目标应用的账号管理API完成删除,逻辑直观;完全基于AWS生态构建,符合你以AWS为主的架构选型。
  • 劣势:需要单独维护每个第三方应用的API认证信息(如密钥、OAuth令牌),还要实现Azure AD用户ID与第三方应用账号的映射逻辑;若后续新增应用,需重复适配API,扩展性较弱。

方案2:Lambda调用Azure AD SCIM端点触发同步

  • 优势:如果第三方应用已配置Azure AD SCIM同步,可复用现有同步逻辑,无需单独对接应用API,减少维护成本。
  • 劣势:强依赖第三方应用的SCIM支持,且需确认O365附带的Azure AD是否允许调用SCIM端点(部分免费/基础O365订阅可能限制API权限);另外,默认Azure AD SCIM同步通常基于用户禁用/删除事件,而非组移除,需额外配置组驱动的同步规则。

关键问题解答

Q:若第三方应用本身不支持SCIM,是否仍可调用Azure AD中该应用的SCIM端点?
A:不行。Azure AD的SCIM端点是为与支持SCIM标准的应用做数据同步设计的,若第三方应用不支持SCIM,Azure AD控制台中该应用的SCIM配置选项不会启用,强行调用端点也无对应应用侧的同步逻辑,无法实现用户删除。


其他可行方案

  • 方案3:Azure AD组事件触发AWS工作流
    配置Azure AD将「用户移除组」事件推送到AWS EventBridge(通过Azure AD Webhook或Azure Monitor事件转发,O365附带的Azure AD支持基础事件推送),实时触发Lambda执行清理动作,贴合你要求的实时触发场景。
  • 方案4:定期扫描式清理
    若实时性要求不高,可配置Lambda按固定周期(如每日)运行:拉取Azure AD目标组的有效用户列表,对比第三方应用的账号列表,删除不在组内的用户。该方案无需事件触发,逻辑简单,适合中小规模用户群体。

AWS Lambda认证到Azure AD的Python代码示例

import requests
import os

def get_azure_ad_token():
    # 从Lambda环境变量读取配置
    tenant_id = os.environ["AZURE_TENANT_ID"]
    client_id = os.environ["AZURE_CLIENT_ID"]
    client_secret = os.environ["AZURE_CLIENT_SECRET"]
    scope = "https://graph.microsoft.com/.default"

    token_url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token"
    payload = {
        "grant_type": "client_credentials",
        "client_id": client_id,
        "client_secret": client_secret,
        "scope": scope
    }

    response = requests.post(token_url, data=payload)
    response.raise_for_status()
    return response.json()["access_token"]

def lambda_handler(event, context):
    # 获取Azure AD服务令牌
    token = get_azure_ad_token()
    headers = {"Authorization": f"Bearer {token}"}

    # 示例:调用Graph API获取目标组的有效用户
    target_group_id = os.environ["TARGET_GROUP_ID"]
    users_res = requests.get(
        f"https://graph.microsoft.com/v1.0/groups/{target_group_id}/members",
        headers=headers
    )
    users_res.raise_for_status()
    active_users = [user["userPrincipalName"] for user in users_res.json()["value"]]

    # 此处添加第三方应用的用户删除逻辑
    # 示例(需替换为目标应用的API):
    # third_party_api_key = os.environ["THIRD_PARTY_API_KEY"]
    # all_app_users = requests.get("https://third-party-app.com/api/users", headers={"Authorization": f"Bearer {third_party_api_key}"}).json()
    # for app_user in all_app_users:
    #     if app_user["email"] not in active_users:
    #         requests.delete(f"https://third-party-app.com/api/users/{app_user['id']}", headers={"Authorization": f"Bearer {third_party_api_key}"})

    return {"statusCode": 200, "body": "Cleanup workflow completed"}

配置说明:

  1. 在Azure AD中注册服务应用,赋予「Group.Read.All」和「User.Read.All」的应用权限(而非委派权限),并生成客户端密钥。
  2. 在Lambda的环境变量中配置AZURE_TENANT_ID、AZURE_CLIENT_ID、AZURE_CLIENT_SECRET、TARGET_GROUP_ID及第三方应用的认证信息。

相关参考内容

  • 《AWS Lambda与Azure AD集成实现用户生命周期自动化》:讲解通过Lambda调用Azure Graph API获取用户状态,结合第三方应用API实现账号清理的完整流程,包含权限配置、用户映射逻辑等细节。
  • 《Azure AD组事件触发AWS工作流实战》:介绍如何将Azure AD的组变更事件推送到AWS EventBridge,实现实时触发Lambda的配置步骤,解决实时性需求。
  • 《O365附带Azure AD的API调用指南》:针对无独立Azure订阅的场景,讲解如何注册应用、配置API权限、调用Graph API的方法,规避订阅限制。

内容的提问来源于stack exchange,提问作者Kiran Hegde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 00:25:55