1

我正在尝试使用新的 Microsoft Bot Framework 来构建 Skype Bots。我想知道是否可以为多个机器人注册相同的端点?

我看到了微软的例子,他们使用 web.config 来存储:

<add key="MicrosoftAppId" value="GUID" />
<add key="MicrosoftAppPassword" value="PASSWORD" />

并使用[BotAuthentication]属性来解决所有问题。

如果可以为多个 Bot 重复使用相同的端点,我应该如何处理身份验证?

谢谢

4

2 回答 2

2

多租户实施 - 可能的解决方案

将消息端点的路由更改为采用通配符,如下所示:

    /// <summary>
    /// POST: api/Messages
    /// Receive a message from a user and reply to it
    /// </summary>
    [Route("messages/{*wildcard}")]
    public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
    {

实现一个多租户机器人身份验证属性,该属性将从最后一个 url 段获取应用程序 ID(或从数据库中获取它的查找)。

例如http://localhost:3979/messages/your-bot-app-id-or-key

[MultiTentantBotAuthentication]
public class MessagesController : ApiController
{

执行

public class MultiTentantBotAuthenticationAttribute : BotAuthentication
{
    public override async Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
    {
        this.MicrosoftAppId = actionContext.Request.RequestUri.Segments.Last();

        await base.OnAuthorizationAsync(actionContext, cancellationToken);
    }
}

如果您需要机器人中的代码来了解它在哪个应用程序中运行,您可以通过 userdata 将其传递,如下所示:

    /// <summary>
    /// POST: api/Messages
    /// Receive a message from a user and reply to it
    /// </summary>
    [Route("messages/{*wildcard}")]
    public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
    {
        var botId = Request.RequestUri.Segments.Last(); // Validate against your database / configuration

        try
        {
            if (activity.Type == ActivityTypes.Message)
            {
                // https://docs.botframework.com/en-us/csharp/builder/sdkreference/stateapi.html

                var stateClient = activity.GetStateClient();
                BotData userData = await stateClient.BotState.GetUserDataAsync(activity.ChannelId, activity.From.Id);
                userData.SetProperty("ApplicationAccountBotId", botId);
                await stateClient.BotState.SetUserDataAsync(activity.ChannelId, activity.From.Id, userData);

                await Conversation.SendAsync(activity, () => actionDialog);
            }
            else
            {
                HandleSystemMessage(activity);
            }
        }
        catch (Exception exception)
        {
            await logger.ErrorAsync(exception);
        }

        return Request.CreateResponse(HttpStatusCode.OK);
    }

然后,您可以在对话框/机器人代码中访问用户数据。

于 2016-08-11T05:30:31.030 回答
0

我可以为同一个 Web 服务(机器人)和同一个端点注册多个机器人框架吗?

如果这就是您的意思,那么答案是否定的,至少对于 Bot Builder SDK 来说不是。对于一个端点,您只能使用一组凭据。我认为对多个机器人注册使用相同的 Microsoft App ID(和密码)没有问题,但目前不支持。

你的用例是什么?您想为同一个机器人拥有多个频道身份(例如在 Facebook 上)?如果你真的需要这个,我相信你可以通过自己实现身份验证来实现这一点(而不是依赖 SDK)。

更新

一个简单的解决方法是拥有多个端点,每个 bot 一个端点,将工作委托给一个公共类。例如,您/bot1/api/messages/为 Bot1 和/bot2/api/messagesBot2 注册,每个控制器使用BotAuthentication具有给定 bot 的 appId 和秘密的属性。您可以像这样使用属性:

[BotAuthentication(MicrosoftAppId="bot1AppId", MicrosoftAppPassword="bot1AppPwd")]
public class Bot1MessagesController : ApiController
...
于 2016-08-01T17:35:58.347 回答