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

基于Bot Framework SDK的多Bot共享端点SSO实现问题求助

多Teams Bot复用端点与SSO解决方案

核心思路

基于现有ConfigurationBotFrameworkAuthentication扩展多Bot认证能力,同时动态匹配对应Bot的SSO中间件,规避过时的ICredentialProvider依赖。

步骤1:扩展多Bot认证配置

创建自定义认证类,继承ConfigurationBotFrameworkAuthentication,重写认证逻辑,根据请求中的Bot ID匹配对应App凭证:

public class MultiBotFrameworkAuthentication : ConfigurationBotFrameworkAuthentication
{
    private readonly IConfiguration _configuration;

    public MultiBotFrameworkAuthentication(IConfiguration configuration) : base(configuration)
    {
        _configuration = configuration;
    }

    public override async Task<AuthenticateRequestResult> AuthenticateRequestAsync(HttpRequest httpRequest, CancellationToken cancellationToken = default)
    {
        // 从请求Activity中提取Bot ID
        var activity = await httpRequest.ReadFromJsonAsync<Activity>(cancellationToken);
        var botId = activity?.Recipient?.Id;

        // 从配置中加载对应Bot的AppID和密码,配置格式参考步骤4
        var botConfig = _configuration.GetSection($"Bots:{botId}");
        if (botConfig.Exists())
        {
            var appId = botConfig["AppId"];
            var appPassword = botConfig["AppPassword"];
            this.CredentialProvider = new SimpleCredentialProvider(appId, appPassword);
        }

        return await base.AuthenticateRequestAsync(httpRequest, cancellationToken);
    }
}

步骤2:实现动态SSO中间件

替换原有单一SSO中间件,创建动态匹配的中间件,根据Bot ID调用对应连接名的SSO逻辑:

public class MultiBotSSOTokenExchangeMiddleware : IMiddleware
{
    private readonly IStorage _storage;
    private readonly IConfiguration _configuration;
    private readonly Dictionary<string, TeamsSSOTokenExchangeMiddleware> _middlewareCache = new();

    public MultiBotSSOTokenExchangeMiddleware(IStorage storage, IConfiguration configuration)
    {
        _storage = storage;
        _configuration = configuration;
    }

    public async Task OnTurnAsync(ITurnContext turnContext, NextDelegate next, CancellationToken cancellationToken = default)
    {
        var botId = turnContext.Activity.Recipient.Id;
        var connectionName = _configuration[$"Bots:{botId}:ConnectionName"];

        if (!string.IsNullOrEmpty(connectionName))
        {
            // 缓存中间件实例,避免重复创建
            if (!_middlewareCache.TryGetValue(botId, out var ssoMiddleware))
            {
                ssoMiddleware = new TeamsSSOTokenExchangeMiddleware(_storage, connectionName);
                _middlewareCache[botId] = ssoMiddleware;
            }

            await ssoMiddleware.OnTurnAsync(turnContext, next, cancellationToken);
            return;
        }

        await next(cancellationToken);
    }
}

步骤3:更新服务注册

在Program.cs中替换原有的认证和中间件配置:

// 注册自定义多Bot认证
builder.Services.AddSingleton<BotFrameworkAuthentication, MultiBotFrameworkAuthentication>();

// 注册动态SSO中间件,替代原有的单一TeamsSSOTokenExchangeMiddleware
builder.Services.AddSingleton<IMiddleware, MultiBotSSOTokenExchangeMiddleware>();

// 保持原有Adapter配置逻辑
builder.Services.AddSingleton<IBotFrameworkHttpAdapter, AdapterWithErrorHandler>();

步骤4:配置文件新增多Bot信息

在appsettings.json中添加所有Bot的凭证与连接名配置:

{
  "Bots": {
    "Bot1_AppId": {
      "AppId": "Bot1_AppId",
      "AppPassword": "Bot1_AppPassword",
      "ConnectionName": "Bot1_OAuth_Connection"
    },
    "Bot2_AppId": {
      "AppId": "Bot2_AppId",
      "AppPassword": "Bot2_AppPassword",
      "ConnectionName": "Bot2_OAuth_Connection"
    }
  }
}

关键注意事项

  • 确保每个Bot在Azure AD中注册的OAuth连接名与配置完全匹配
  • 动态中间件使用缓存机制减少实例化开销
  • Bot ID提取逻辑需根据实际请求场景调整,保证准确性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 11:12:17