マルチテナントの実装 - 考えられる解決策
メッセージ エンドポイントのルートを次のようにワイルドカードを使用するように変更します。
/// <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);
}
}
ボットが動作しているアプリを知るためにボットのコードが必要な場合は、次のようにユーザーデータを介して渡すことができます。
/// <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);
}
その後、ダイアログ/ボット コードでユーザー データにアクセスできます。