【问题标题】:Creating Graph API subscriptions with MailRead.Basic scope throws error on client credential flow使用 MailRead.Basic 范围创建 Graph API 订阅会在客户端凭据流上引发错误
【发布时间】:2020-12-07 09:33:37
【问题描述】:

一位管理员客户确实同意以下应用程序权限范围(适用于所有公司),并限制了documentation 中提到的启用邮件的安全组:Calendars.Read MailboxSettings.Read Directory.Read.All Mail.ReadBasic Reports.Read.All

身份验证流程发回此令牌,这意味着身份验证有效:

[{"aud"=>"https://graph.microsoft.com",
  "iss"=>"https://sts.windows.net/XXXXXXXXXXXXXXXXX/",
  "iat"=>1607330778,
  "nbf"=>1607330778,
  "exp"=>1607334678,
  "aio"=>"XXXXXXXXXXXXXXXXXXX",
  "app_displayname"=>"XXXXXXXXXXXXXXXX",
  "appid"=>"XXXXXXXXXXXXXXXXXXXXXXX",
  "appidacr"=>"2",
  "idp"=>"XXXXXXXXXXXXXXXXXXXXXXXXXX",
  "idtyp"=>"app",
  "oid"=>"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "rh"=>"XXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "roles"=>["Calendars.Read", "MailboxSettings.Read", "Directory.Read.All", "Mail.ReadBasic", "Reports.Read.All"],
  "sub"=>"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "tenant_region_scope"=>"EU",
  "tid"=>"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "uti"=>"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "ver"=>"1.0",
  "xms_tcdt"=>1356598049},
 {"typ"=>"JWT", "nonce"=>"XXXXXXXXXXXXXXXXXXXXXXX", "alg"=>"RS256", "x5t"=>"XXXXXXXXXXXXXXXXXXXXXXXXXXXX", "kid"=>"XXXXXXXXXXXXXXXXXXXXXXXXXXX"}]

此令牌用于获取特定用户的消息,调用:GET /users/{id}/messages,这意味着身份验证令牌对 MailRead.Basic 和此特定用户有效。

同一用户的同一令牌发送 403 以订阅邮箱上的 webhook:POST /subscriptions

请求正文:

{
   "changeType": "created",
   "notificationUrl": "XXXXXX",
   "resource": "users/{target_user_id}/messages",
   "expirationDateTime":"{relevant_timestamp}",
   "clientState": "secretClientValue",
   "latestSupportedTlsVersion": "v1_2"
}

从 Graph API 回答:

{
    "error": {
        "code": "ExtensionError",
        "message": "Operation: Create; Exception: [Status Code: Forbidden; Reason: Access is denied. Check credentials and try again.]",
        "innerError": {
            "date": "2020-12-07T09:15:54",
            "request-id": "xxxxxxxxxxxxxxxxx",
            "client-request-id": "xxxxxxxxxxxxxxxxxxxx"
        }
    }
}

【问题讨论】:

  • 请分享您在 AAD 应用程序中添加的权限的屏幕截图。
  • 可以试试添加应用权限Mail.Read吗?
  • 能否请您分享此失败请求的 requestid 和时间戳?
  • @Shiva-MSFTIdentity:“日期”:“2020-12-07T10:06:19”、“请求 ID”:“806543c4-7ab4-41a0-88b5-071df22ee68f”、“客户-请求ID”:“806543c4-7ab4-41a0-88b5-071df22ee68f”
  • @AllenWu 当然不是 ;)。出于明显的安全和保密原因,我们仅对客户使用 MailRead.Basic 范围。

标签: azure-active-directory microsoft-graph-api webhooks


【解决方案1】:

@Allen 是对的,根据document

创建订阅需要资源的读取范围。为了 例如,要获取消息的更改通知,您的应用需要 Mail.Read 权限。

【讨论】:

  • 但在您共享的 Microsoft 文档中,准确提到消息订阅所需的范围是 Mail.Read 或 Mail.ReadBasic。请参阅此处:“根据请求的资源和权限类型(委托或应用程序),下表中指定的权限是调用此 API 所需的最低权限。”和下表
  • @Sybic2001 是的,文档中列出的权限是从低到高的,但是获取消息的更改通知比较特殊,需要您拥有最高权限。此外,文件在显眼处也有特殊说明,必须有“Mail.Read”权限。
  • 我明白你的意思,但这没有意义:通知只发送元素的 ID,它与 Mail.ReadBasic 范围完全兼容。所以它仍然需要微软的澄清;)因为这两个元素仍然在文档中被引用。阻止 Mail.ReadBasic 范围订阅的特权没有逻辑。
  • @Sybic2001 你的逻辑是对的,只是不同的api端点对权限的要求不同。你不能混淆他们。微软文档虽然没有详细说明这一点,但依然在显眼位置标注。建议您以文档为准。
猜你喜欢
  • 2022-08-18
  • 2020-04-28
  • 1970-01-01
  • 2023-02-02
  • 2020-12-25
  • 2020-03-01
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
相关资源
最近更新 更多