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

在Logic Apps中使用系统分配托管身份结合委派权限获取共享邮箱附件

解决方案:系统分配托管身份+委派权限下的Logic Apps邮箱附件同步

核心限制说明

系统分配托管身份属于应用身份,无法直接使用委派权限(委派权限依赖用户上下文)。针对你的约束,提供两种可行方案:


方案一:基于OBO(On-Behalf-Of)流实现(适配委派权限)

该方案通过托管身份代表授权用户调用Graph API,绕过应用权限限制,无需存储用户密码。

前提条件

  • 一个拥有共享邮箱访问权限的服务用户账号
  • 已启用系统分配托管身份的Logic Apps
  • Azure Key Vault(用于存储敏感令牌)
  • 后端已为该服务用户授予Mail.Read委派权限(需管理员同意)

分步实施

1. 创建Azure AD应用注册(用于OBO流程)

  • 在Azure AD中新建应用注册,设置重定向URI为https://login.microsoftonline.com/common/oauth2/nativeclient
  • 为应用注册添加Mail.Read和offline_access委派权限,提交管理员同意
  • 生成客户端密钥,将密钥值存入Key Vault(后续Logic Apps需读取)

2. 手动获取用户刷新令牌

  • 打开浏览器访问授权URL,用服务用户账号登录获取授权码:
    GET https://login.microsoftonline.com/{你的租户ID}/oauth2/v2.0/authorize?
    client_id={应用注册ID}
    &response_type=code
    &redirect_uri=https://login.microsoftonline.com/common/oauth2/nativeclient
    &response_mode=query
    &scope=Mail.Read offline_access
    &state=random-string
    
  • 用授权码交换刷新令牌(可借助Postman等工具):
    POST https://login.microsoftonline.com/{你的租户ID}/oauth2/v2.0/token
    Content-Type: application/x-www-form-urlencoded
    
    client_id={应用注册ID}
    &scope=Mail.Read offline_access
    &code={获取的授权码}
    &redirect_uri=https://login.microsoftonline.com/common/oauth2/nativeclient
    &grant_type=authorization_code
    &client_secret={应用注册密钥}
    
  • 将返回的refresh_token存入Key Vault,配置Key Vault访问策略允许Logic Apps的系统分配托管身份读取该机密

3. 配置Logic Apps托管身份权限

  • 在Logic Apps资源的「身份」选项卡,开启系统分配托管身份并保存
  • 给该托管身份分配Key Vault的「机密读取」权限(在Key Vault的「访问策略」中添加)

4. 构建Logic Apps工作流

  1. 触发器:选择「Recurrence」(定时触发,比如每小时执行一次)
  2. 读取刷新令牌:添加「Azure Key Vault - Get Secret」动作,指定Key Vault和刷新令牌的机密名称
  3. OBO获取用户访问令牌:添加「HTTP」动作,配置如下:
    • 方法:POST
    • URI:https://login.microsoftonline.com/{你的租户ID}/oauth2/v2.0/token
    • 头部:Content-Type: application/x-www-form-urlencoded
    • 正文:
      client_id={应用注册ID}
      &grant_type=refresh_token
      &refresh_token=@body('Get_Secret')?['value']
      &scope=Mail.Read
      &client_secret={应用注册密钥}
      &requested_token_use=on_behalf_of
      &assertion=@access_token()
      
      注:@access_token()是Logic Apps内置表达式,用于获取托管身份的访问令牌作为OBO断言
  4. 获取共享邮箱带Excel附件的邮件:添加「HTTP」动作,配置如下:
    • 方法:GET
    • URI:https://graph.microsoft.com/v1.0/users/{共享邮箱地址}/messages?$filter=hasAttachments eq true and attachment/contentType eq 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
    • 头部:Authorization: Bearer @body('HTTP_2')?['access_token']
  5. 遍历邮件附件:添加「For each」动作,选择上一步返回的value数组
  6. 下载附件内容:在循环内添加「HTTP」动作:
    • 方法:GET
    • URI:https://graph.microsoft.com/v1.0/users/{共享邮箱地址}/messages/@items('For_each')?['id']/attachments/@items('For_each')?['attachments'][0]['id']/$value
    • 头部:Authorization: Bearer @body('HTTP_2')?['access_token']
  7. 上传到ADLS:在循环内添加「Azure Data Lake Storage Gen2 - Create file」动作,使用系统分配托管身份认证,指定存储账户、文件系统和文件路径(比如/shared-mailbox-excels/@{items('For_each')?['attachments'][0]['name']}),文件内容选择上一步HTTP动作的body

方案二:简化方案(请求后端调整权限)

如果后端团队可以接受授予应用权限,这是最直接的方案:

  1. 为Logic Apps的系统分配托管身份授予Mail.Read.Shared应用权限(需管理员同意)
  2. 使用Logic Apps的「HTTP」或「Microsoft Graph」连接器,直接用托管身份认证调用Graph API获取附件
  3. 后续上传ADLS的步骤和方案一一致,无需OBO流程

注意事项

  • 刷新令牌有效期默认90天,可设置单独的Logic Apps工作流自动刷新令牌
  • 确保服务用户账号已被添加为共享邮箱的成员(在Exchange Admin Center配置)
  • 所有敏感参数(租户ID、应用注册ID/密钥)均需存储在Key Vault,禁止硬编码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 22:30:59