Bot Framework dotnet Slack 适配器在更改事件请求时无法验证 Slack 请求 Url

Bot Framework dotnet Slack adapter fails to verify Slack request when changing the Events Request Url

我有一个 Slack 机器人,它运行良好并且可以与用户交互。我正在使用 Bot Framework composer 和 Slack Adapter。 在 Slack API 门户中,我正在尝试更改应用程序用于向我的机器人发送 Slack 事件的事件请求 Url。 当我这样做时,slack 会向我的机器人发送挑战请求。机器人首先尝试验证请求是否真的来自以下 Slack:https://api.slack.com/authentication/verifying-requests-from-slack#a_recipe_for_security

问题是这是失败的,我不明白为什么。 我看到 Slack 正在发送所有正确的内容,并且正在读取 ClientSigningSecret,否则对机器人的其他调用将不起作用。

我知道问这个有点牵强,因为这似乎是我这边的问题。但是由于当用户与机器人交谈时机器人正在验证请求,并且代码来自开源的 Slack Adapter,我无能为力......也许有人遇到了同样的问题。

我创建了 Slack 的支持票,他们很快就回来了。

发布前状态

在发布 Slack 应用程序之前,唯一存在的配置是您在应用程序配置页面中看到的配置。这些是您用来测试应用程序的内容,其中包括对从 Slack 传入后端的传入消息进行身份验证的秘密。

首次发布 Slack 应用后

一旦您的应用程序发布,您的用户使用的生产版本将看到原始设置,包括机密,这些是您的后端将获得的。 您在配置页面中看到的设置类似于开发模式,在您请求 Slack 批准您的更改之前,它们不会保留到已发布的应用程序中。这听起来不错,也是人们所期望的,但你没有看到也无法想象正在发生的是,有一些开发时间的秘密与你在设置屏幕上看到的不同。

当您更改要发送到后端的端点 url 以便它可以 return 挑战并且 Slack 会接受新的 url 时,消息有效负载随之而来开发机密,而不是您配置后端的机密。因此,您的后端将拒绝调用,因为它认为它不是来自 Slack。

Slack 提出的解决方案

不要在已发布的应用中验证此类调用的传入请求的签名。我不喜欢它,但没有其他解决方法,除非 Slack 改变它。所以我所做的是:

  1. 从后端删除仅针对此请求的检查并发布到生产环境。
  2. 在 Slack 中进行 url 更改。
  3. 从后端还原更改。

:(