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

无需Azure,如何为Microsoft Teams机器人配置第三方基础身份验证?

实现Teams机器人复用Web应用邮箱密码验证方案

核心思路

Teams机器人可通过**任务模块(Task Module)**弹出自定义验证界面,对接你的Web应用验证接口,验证通过后将结果传回机器人,再向用户发送专属卡片。

步骤1:触发弹出验证窗口

当用户发送触发验证的指令(如“登录”)时,机器人返回任务模块响应,加载适配Teams的Web应用登录页。

示例代码(C#):

private async Task<MessagingExtensionResponse> HandleLoginTrigger(ITurnContext<IInvokeActivity> turnContext, CancellationToken cancellationToken)
{
    var taskModule = new TaskModuleResponse
    {
        Task = new TaskModuleContinueResponse
        {
            Value = new TaskModuleTaskInfo
            {
                Title = "账户验证",
                Width = 400,
                Height = 300,
                Url = "https://你的Web应用域名/login/teams" // 指向适配Teams的登录页面
            }
        }
    };
    return taskModule;
}

步骤2:Web应用登录页适配Teams交互

在登录页完成邮箱密码验证后,调用Teams JS SDK的task.submit接口,将验证结果(如用户ID、合法令牌)传回机器人。

示例前端代码(JS):

// 登录表单提交逻辑
document.getElementById('login-form').addEventListener('submit', async (e) => {
    e.preventDefault();
    const email = document.getElementById('email').value;
    const password = document.getElementById('password').value;

    // 调用Web应用验证接口
    const authRes = await fetch('https://你的Web应用域名/api/auth', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ email, password })
    });

    if (authRes.ok) {
        const userData = await authRes.json();
        // 向机器人返回验证成功信息
        microsoftTeams.tasks.submitTask({
            userId: userData.id,
            isAuth: true,
            userName: userData.name
        });
    } else {
        alert('验证失败,请检查邮箱或密码');
    }
});

// 初始化Teams SDK
microsoftTeams.initialize();

步骤3:机器人接收验证结果并发送卡片

机器人监听任务模块提交事件,验证返回信息的合法性(可二次调用Web应用接口确认),然后向用户发送专属自适应卡片。

示例代码(C#):

protected override async Task OnTeamsTaskModuleSubmitAsync(ITurnContext<IInvokeActivity> turnContext, TaskModuleRequest taskModuleRequest, CancellationToken cancellationToken)
{
    var submitData = JsonConvert.DeserializeObject<LoginResult>(taskModuleRequest.Data.ToString());
    if (submitData.IsAuth)
    {
        // 二次验证用户合法性
        var isValid = await VerifyUserWithWebApp(submitData.UserId);
        if (isValid)
        {
            // 构建专属自适应卡片
            var welcomeCard = new AdaptiveCard(new AdaptiveSchemaVersion(1, 0))
            {
                Body = {
                    new AdaptiveTextBlock { Text = $"欢迎回来,{submitData.UserName}!", Size = AdaptiveTextSize.Large },
                    new AdaptiveTextBlock { Text = "这是你的专属内容卡片" },
                    new AdaptiveFactSet { Facts = { new AdaptiveFact("用户ID", submitData.UserId) } }
                }
            };

            var cardAttachment = new Attachment
            {
                ContentType = AdaptiveCard.ContentType,
                Content = welcomeCard
            };

            await turnContext.SendActivityAsync(MessageFactory.Attachment(cardAttachment), cancellationToken);
        }
        else
        {
            await turnContext.SendActivityAsync("验证信息无效,请重新登录", cancellationToken: cancellationToken);
        }
    }
    else
    {
        await turnContext.SendActivityAsync("登录失败,请重试", cancellationToken: cancellationToken);
    }

    return new TaskModuleResponse();
}

// 调用Web应用接口验证用户合法性
private async Task<bool> VerifyUserWithWebApp(string userId)
{
    var verifyRes = await HttpClient.GetAsync($"https://你的Web应用域名/api/users/{userId}/verify");
    return verifyRes.IsSuccessStatusCode;
}

关键注意事项

  • 配置Web应用的CORS策略,允许Teams相关域名(如https://teams.microsoft.com)嵌入登录页。
  • 所有敏感数据传输必须使用HTTPS,避免明文泄露。
  • 机器人与Web应用间的身份校验建议使用短时效令牌,而非固定用户ID,提升安全性。
  • 可在机器人侧存储Teams用户ID与Web应用用户ID的关联关系,避免重复验证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 19:15:10