Microsoft Teams 应用程序 - 为 Task/Fetch 卡操作添加身份验证和授权

Microsoft Teams App - Add Authentication and Authorization for Task/Fetch Card Action

位于 BotBuilder-Samples GitHub 存储库中:https://github.com/microsoft/BotBuilder-Samples

有一个示例应用程序:54.teams-task-module。此应用演示了一个 task/fetch 操作,其中包含 Url 到由 Razor 页面呈现的自定义表单。

https://github.com/microsoft/BotBuilder-Samples/tree/main/samples/csharp_dotnetcore/54.teams-task-module

在 Bot 中,OnTeamsTaskModuleFetchAsync 方法被覆盖为 return 一个 TaskModuleResponse,它告诉系统获取 URL 在响应中传递回 Teams。

https://github.com/microsoft/BotBuilder-Samples/blob/main/samples/csharp_dotnetcore/54.teams-task-module/Bots/TeamsTaskModuleBot.cs

 protected override Task<TaskModuleResponse> OnTeamsTaskModuleFetchAsync(ITurnContext<IInvokeActivity> turnContext, TaskModuleRequest taskModuleRequest, CancellationToken cancellationToken)
    {
        var asJobject = JObject.FromObject(taskModuleRequest.Data);
        var value = asJobject.ToObject<CardTaskFetchValue<string>>()?.Data;

        var taskInfo = new TaskModuleTaskInfo();
        switch (value)
        {
            case TaskModuleIds.YouTube:
                taskInfo.Url = taskInfo.FallbackUrl = _baseUrl + "/" + TaskModuleIds.YouTube;
                SetTaskInfo(taskInfo, TaskModuleUIConstants.YouTube);
                break;
            case TaskModuleIds.CustomForm:
                taskInfo.Url = taskInfo.FallbackUrl = _baseUrl + "/" + TaskModuleIds.CustomForm;
                SetTaskInfo(taskInfo, TaskModuleUIConstants.CustomForm);
                break;
            case TaskModuleIds.AdaptiveCard:
                taskInfo.Card = CreateAdaptiveCardAttachment();
                SetTaskInfo(taskInfo, TaskModuleUIConstants.AdaptiveCard);
                break;
            default:
                break;
        }

        return Task.FromResult(taskInfo.ToTaskModuleResponse());
    }

我在 Teams 中启用了开发人员工具并观察了网络请求,并重写了我能找到的所有方法以尝试找到一个可扩展点以将某种令牌注入到请求中,以便 URL可以防止 public 匿名访问。

问题:我现在看到的在 Razor 页面上提供授权的唯一方法是在查询字符串上传递令牌并使用自定义授权处理程序来处理令牌。

是否有更好的方法将令牌或任何其他信息注入 task/fetch 请求,以便对请求进行身份验证和授权?

要明确这一点,身份验证是可能的,但仅适用于网页(自适应卡片不需要它)。此身份验证将依赖于标准 SSO 团队为任务模块和选项卡提供的服务。请参阅此处了解介绍指南:https://docs.microsoft.com/en-us/microsoftteams/platform/tabs/how-to/authentication/auth-aad-sso?tabs=dotnet,尤其是:

The SSO API also works in task modules that embed web content.

所以您的问题实际上变成了“我如何为 Teams 中的 Web 内容执行 SSO”。这是一个很棒的视频,其中包含 link 到文本(博客)版本的内容:https://devblogs.microsoft.com/microsoft365dev/lets-decode-single-sign-on-sso-in-microsoft-teams-tabs/. Here's a working sample, with both Node and DotNet backend options: https://adoption.microsoft.com/sample-solution-gallery/pnp-sp-dev-teams-sample-tab-sso。请注意,示例和文档通常侧重于执行 OnBehalfOf (OBO) 操作来调用 Graph,但原理保持不变 - 您将获得一个 JWT 令牌,您可以将其传回后端,然后您可以对其进行验证。您还可以从令牌中获取已登录用户的用户信息。

根据我的评论:将其视为“Web inside Adaptive”并重新访问示例项目和您的信息,“CustomForm”razor 页面似乎正在初始化 Teams JavaScript SDK。

这确实意味着我可以使用您提到的 SSO 验证此内容。

我只认为它可以在 TAB 中工作,而不是在机器人中工作 card.Solved,请遵循选项卡 javascript SDK 指南。