Office 365 中可操作邮件的安全性要求

重要

由于服务升级,具有 全局 范围的新可操作消息提供程序的加入将暂时暂停到 2024 年 6 月 30 日。 现有的全球范围提供程序以及组织和测试范围提供程序的加入不受影响。 有关详细信息,请参阅 可操作消息的常见问题解答

保护可操作邮件的操作非常简单方便。 端到端体验中有两个阶段,当支持 Office 365 可操作邮件时会对服务施加安全性要求。 阶段及其相应要求如下所示。

  1. 发送阶段:服务发送可操作邮件的先决条件如下所示:
    • 如果要使用可操作电子邮件,需要启用发件人验证。 请注意,这不适用于连接器邮件。
    • 必须向 Microsoft 注册服务。
    • 操作 URL 必须支持 HTTPS。
  2. 操作处理阶段:当处理某项操作时,服务应:
    • 验证 HTTP POST 请求的标头中包含的持有者令牌(JSON Web 令牌)。 还可以使用 Microsoft 提供的示例库完成此操作。
    • 在目标 URL 中包含服务中的有限目的令牌,服务可使用它将服务 URL 与目标请求和用户关联起来。 这是可选的,但强烈推荐。

发件人验证

Office 365 要求发件人验证,以通过电子邮件启用可操作邮件。 你的可操作电子邮件必须源自实施域密钥识别邮件 (DKIM) 和发件人策略框架 (SPF) 的服务器,或必须实施签名卡

尽管 DKIM 和 SPF 对于一些应用场景已足够,但该解决方案并不适用于通过外部提供商发送电子邮件的某些应用场景,它可能会导致收件人无法体验增强的可操作邮件。 为此,我们建议始终实施签名卡,这在所有情况下均适用,并且从根本上来说,这样更为安全,因为它们并不依赖于 DNS 记录。

实施 DKIM 和 SPF

DKIM 和 SPF 是在通过 SMTP 发送电子邮件时证明发件人身份的行业标准方法。 很多公司已实施这些标准,用于保护已发送的电子邮件的安全。 若要详细了解 SPF/DKIM 以及如何实施,请参阅:

签名卡有效负载

通过电子邮件发送的可操作邮件支持其他验证方法:可使用 RSA 密钥或 X509 证书对卡有效负载进行签名。 此方法在以下应用场景中是必需的:

  • 因 Office 365 服务前的发件人设置或收件人租户设置自定义安全服务导致的 SPF/DKIM 故障。
  • 可操作邮件的应用场景要求从多个电子邮件帐户发送。

要使用签名卡,必须在电子邮件开发人员仪表板中注册公钥,并使用相应的私钥对卡进行签名。

SignedCard

通过电子邮件发送时,可使用签名的可操作邮件卡。 使用此格式在电子邮件的 HTML 正文中添加签名卡。 此有效负载已使用附加到 HTML 正文末尾的 Microdata 格式序列化。

<section itemscope itemtype="http://schema.org/SignedAdaptiveCard">
    <meta itemprop="@context" content="http://schema.org/extensions" />
    <meta itemprop="@type" content="SignedAdaptiveCard" />
    <div itemprop="signedAdaptiveCard" style="mso-hide:all;display:none;max-height:0px;overflow:hidden;">[SignedCardPayload]</div>
</section>

注释:喜欢使用传统邮件卡片实体的合作伙伴可以创建 SignedMessageCard 实体,以替代 SignedAdaptiveCard。

SignedCardPayload

SignedCardPayload 字符串采用 JSON Web 签名 (JWS) 标准编码。 RFC7515 介绍了 JWS,RFC7519 介绍了 JSON Web 令牌 (JWT)。 如果 JWT 中无需任何声明,则可使用 JWT 库来构建 JWS 签名。

注释:术语“JWT”在实际应用中可以互换使用。 但是,我们在此更偏向于使用“JWS”。

以下是 SignedCardPayload 示例。 已编码的自适应卡片按照 JWS 规范以 [标头].[有效负载].[签名] 形式显示。

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZW5kZXIiOiJzZXJ2aWNlLWFjY291bnRAY29udG9zby5jb20iLCJvcmlnaW5hdG9yIjoiNjVjNjgwZWYtMzZhNi00YTFiLWI4NGMtYTdiNWM2MTk4NzkyIiwicmVjaXBpZW50c1NlcmlhbGl6ZWQiOiJbXCJqb2huQGNvbnRvc28uY29tXCIsXCJqYW5lQGNvbnRvc28uY29tXCJdIiwiYWRhcHRpdmVDYXJkU2VyaWFsaXplZCI6IntcIiRzY2hlbWFcIjpcImh0dHA6Ly9hZGFwdGl2ZWNhcmRzLmlvL3NjaGVtYXMvYWRhcHRpdmUtY2FyZC5qc29uXCIsXCJ0eXBlXCI6XCJBZGFwdGl2ZUNhcmRcIixcInZlcnNpb25cIjpcIjEuMFwiLFwiYm9keVwiOlt7XCJzaXplXCI6XCJsYXJnZVwiLFwidGV4dFwiOlwiSGVsbG8gQWN0aW9uYWJsZSBtZXNzYWdlXCIsXCJ3cmFwXCI6dHJ1ZSxcInR5cGVcIjpcIlRleHRCbG9ja1wifV0sXCJhY3Rpb25zXCI6W3tcInR5cGVcIjpcIkFjdGlvbi5JbnZva2VBZGRJbkNvbW1hbmRcIixcInRpdGxlXCI6XCJPcGVuIEFjdGlvbmFibGUgTWVzc2FnZXMgRGVidWdnZXJcIixcImFkZEluSWRcIjpcIjNkMTQwOGY2LWFmYjMtNGJhZi1hYWNkLTU1Y2Q4NjdiYjBmYVwiLFwiZGVza3RvcENvbW1hbmRJZFwiOlwiYW1EZWJ1Z2dlck9wZW5QYW5lQnV0dG9uXCJ9XX0iLCJpYXQiOjE1NDUzNDgxNTN9.BP9mK33S1VZyjtWZd-lNTTjvueyeeoitygw9bl17TeQFTUDh9Kg5cB3fB7BeZYQs6IiWa1VGRdiiR4q9EkAB1qDsmIcJnw6aYwDUZ1KY4lNoYgQCH__FxEPHViGidNGtq1vAC6ODw0oIfaTUWTa5cF5MfiRBIhpQ530mbRNnA0QSrBYtyB54EDJxjBF1vNSKOeVHAl2d4gqcGxsytQA0PA7XMbrZ8B7fEU2uNjSiLQpoh6A1tevpla2C7W6h-Wekgsmjpw2YToAOX67VZ1TcS5oZAHmjv2RhqsfX5DlN-ZsTRErU4Hs5d92NY9ijJPDunSLyUFNCw7HLNPFqqPmZsw

以上 JWS 中的标头为:

{
  "alg": "RS256",
  "typ": "JWT"
}

以上 JWS 中的有效负载为:

{
  "sender": "service-account@contoso.com",
  "originator": "65c680ef-36a6-4a1b-b84c-a7b5c6198792",
  "recipientsSerialized": "[\"john@contoso.com\",\"jane@contoso.com\"]",
  "adaptiveCardSerialized": "{\"$schema\":\"http://adaptivecards.io/schemas/adaptive-card.json\",\"type\":\"AdaptiveCard\",\"version\":\"1.0\",\"body\":[{\"size\":\"large\",\"text\":\"Hello Actionable message\",\"wrap\":true,\"type\":\"TextBlock\"}],\"actions\":[{\"type\":\"Action.InvokeAddInCommand\",\"title\":\"Open Actionable Messages Debugger\",\"addInId\":\"3d1408f6-afb3-4baf-aacd-55cd867bb0fa\",\"desktopCommandId\":\"amDebuggerOpenPaneButton\"}]}",
  "iat": 1545348153
}
必需的声明
声明 描述
originator 必须设置为在载入时由 Microsoft 提供的 ID。
iat 签名有效负载的时间。
sender 用于发送此可操作邮件的电子邮件地址。
recipientsSerialized 电子邮件收件人的字符串化列表。 该列表应包括电子邮件的所有收件人/抄送收件人。
adaptiveCardSerialized 字符串化自适应卡片。

生成已签名卡片的示例代码:

验证该请求是否来自 Microsoft

Microsoft 的所有操作请求均在 HTTP Authorization 标头中具有持有者令牌。 此令牌是 Microsoft 签名的 JSON Web 令牌 (JWT),而且其中还包括我们强烈建议应由处理相关请求的服务验证的重要声明。

声明名称
aud 目标服务的基本 URL,例如 https://api.contoso.com
iss 令牌的颁发者。 这应该是 https://substrate.office.com/sts/
sub 采取行动的用户的标识。 对于通过电子邮件发送的可操作邮件,sub 将是用户的电子邮件地址。 对于连接器,sub 将是采取行动的用户的 objectID。
sender 包含该操作的邮件的发件人标识。 只有在 通过电子邮件发送 可操作性邮件时,此值才会显示。 通过连接器发送 的邮件在持有者令牌中不包含此声明。

通常,服务将执行以下验证。

  1. 该令牌由 Microsoft 签名。 OpenID 元数据位于 https://substrate.office.com/sts/common/.well-known/openid-configuration,其中包括有关签名密钥的信息。
  2. aud 声明对应于服务的基本 URL。

完成上述所有验证后,服务就可以信任 sendersub 声明是以发件人和执行操作的用户身份发出的。 服务可以验证 和 sub 声明是否sender与所期望的发件人和用户匹配。

请参考以下 Microsoft 代码示例,其中展示了如何对 JWT 令牌执行这些验证。

Action-Authorization 标头

可操作邮件使用 Authorization 标头可能会干扰目标终结点的现有身份认证/授权机制。 在这种情况下,开发人员可以在操作的 Action.Http 属性中headers将 标头设置为Authorization空字符串。 然后,可操作邮件将通过 Action-Authorization 标头而不使用 Authorization 标头发送相同的持有者令牌。

提示

如果 Authorization 标头包含通过可操作邮件设置的持有者令牌,则 Azure 逻辑应用服务将返回 HTTP 401 Unauthorized

带有 Action-Authorization 标头的示例 Action.Http

{
  "type": "Action.Http",
  "title": "Say hello",
  "method": "POST",
  "url": "https://api.contoso.com/sayhello",
  "body": "{{nameInput.value}}",
  "headers": [
    { "name": "Authorization", "value": "" }
  ]
}

验证用户的标识

所有请求随附的持有者令牌都包括执行此操作的 Office 365 用户的 Azure AD 标识。 如有必要,可将特定于服务的令牌添加到 HTTP 操作的 URL 中,用于表示系统中的用户标识。 Microsoft 并未规定如何设计有限访问令牌或服务应如何使用该令牌。 此令牌对于 Microsoft 来说并不透明,并且只会返回到服务。

特定于服务的令牌可用于将服务 URL 与特定邮件和用户相关联。 如果使用自己的特定于服务的令牌,Microsoft 建议将其添加为操作目标 URL 的一部分,或添加到返回至服务的请求正文中。 例如:

https://contoso.com/approve?requestId=abc&serviceToken=a1b2c3d4e5...

特定于服务的令牌用作关联 ID(例如使用 userID、requestID 和加密盐的哈希令牌)。 这允许服务提供商跟踪生成的操作 URL,并在有操作请求时将其发送并匹配。 除了关联之外,服务提供商还可以使用特定于服务的令牌保护自身免受重播攻击。 例如,如果以前已使用同一令牌执行了此操作,服务提供商可选择拒绝该请求。