Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Botframework 允许聊天机器人使用多个Microsoft应用程序ID_Botframework_Azure Bot Service - Fatal编程技术网

Botframework 允许聊天机器人使用多个Microsoft应用程序ID

Botframework 允许聊天机器人使用多个Microsoft应用程序ID,botframework,azure-bot-service,Botframework,Azure Bot Service,我有一个在localhost上工作的聊天机器人,它工作得很好。然后,我在Azure上添加了一个新的Bot通道注册以进行测试,而且效果也不错。我通过获取它的Microsoft应用程序ID和密码并将其放入我的appsettings.json文件中实现了这一点 但是,我需要添加另一个Bot通道注册。当我在该注册上测试它时,我的bot返回一个错误。这是因为它有一个新的应用程序ID和密码。但是我已经在我的第一个注册频道中输入了应用程序ID和密码。我需要他们两个一起工作 如何允许我的聊天机器人接受多个应用I

我有一个在localhost上工作的聊天机器人,它工作得很好。然后,我在Azure上添加了一个新的Bot通道注册以进行测试,而且效果也不错。我通过获取它的Microsoft应用程序ID和密码并将其放入我的appsettings.json文件中实现了这一点

但是,我需要添加另一个Bot通道注册。当我在该注册上测试它时,我的bot返回一个错误。这是因为它有一个新的应用程序ID和密码。但是我已经在我的第一个注册频道中输入了应用程序ID和密码。我需要他们两个一起工作


如何允许我的聊天机器人接受多个应用ID和密码?或者,我如何完全摆脱这种安全级别(即允许所有应用程序ID和密码)?

正如@Mick所建议的,答案是为每个频道创建一个机器人适配器。如果您希望它真正具有动态性,可以执行以下操作:

BotController.cs
[HttpPost,HttpGet]
公共异步任务PostAsync()
{
var credentialProvider=new simpleredentialprovider(YourAppId,YourAppPassword);//对于每个适配器
适配器=新的BotFrameworkHttpAdapter(credentialProvider);//对于每个适配器
wait Adapter.ProcessAsync(请求、响应、Bot);
}

使用自定义
ICredentialProvider
可以从任何位置检索appid和密码:

public class MultiCredentialProvider : ICredentialProvider
{
    public Dictionary<string, string> Credentials = new Dictionary<string, string>
    {
        { "YOUR_MSAPP_ID_1", "YOUR_MSAPP_PASSWORD_1" },
        { "YOUR_MSAPP_ID_2", "YOUR_MSAPP_PASSWORD_2" }
    };

    public Task<bool> IsValidAppIdAsync(string appId)
    {
        return Task.FromResult(this.Credentials.ContainsKey(appId));
    }

    public Task<string> GetAppPasswordAsync(string appId)
    {
        return Task.FromResult(this.Credentials.ContainsKey(appId) ? this.Credentials[appId] : null);
    }

    public Task<bool> IsAuthenticationDisabledAsync()
    {
        return Task.FromResult(!this.Credentials.Any());
    }
}
公共类MultiCredentialProvider:ICredentialProvider
{
公共字典凭据=新字典
{
{“您的{MSAPP_ID_1”,“您的{MSAPP_密码{u 1}”,
{“您的_MSAPP_ID_2”,“您的_MSAPP_密码_2”}
};
公共任务IsValidAppIsync(字符串appId)
{
返回Task.FromResult(this.Credentials.ContainsKey(appId));
}
公共任务GetAppPasswordAsync(字符串appId)
{
返回Task.FromResult(this.Credentials.ContainsKey(appId)?this.Credentials[appId]:null);
}
公共任务IsAuthenticationDisabledAsync()
{
返回Task.FromResult(!this.Credentials.Any());
}
}
然后,在Startup.cs中:

services.AddSingleton<ICredentialProvider, MultiCredentialProvider>();
services.AddSingleton();

您使用的是C、JavaScript还是Python?您是否尝试过基于不同的应用程序ID创建多个适配器?例如,可以使用动态端点动态加载正确的端点<代码>/api/messages/{app_id}我正在使用dot-net。你能告诉我如何创建多个适配器吗?我可以为每个适配器分配自己的应用程序id和应用程序机密?你怎么说它可以从任何地方检索?如果您想从数据库加载它并注入一个作用域数据库存储库,您将得到一个错误,因为ICredentialProvider是一个单例类。有什么想法吗?依赖项注入库通常允许在单例中创建临时范围的依赖项。