我目前正在尝试建立一个新的团队机器人,但无法真正实现。
我在Azure中创建了一个新的Azure Bot服务,将其设置为UserAssignedMSI,并设法将其添加到团队中。如果我向机器人发送一些东西,我还可以看到像OnTurnAsync
和OnMessageActivityAsync
这样的方法被触发了,所以到目前为止一切都很好。
但当我试图寄回一些东西的时候,比如:
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
await turnContext.SendActivityAsync(MessageFactory.Text("hello"), cancellationToken);
await base.OnMessageActivityAsync(turnContext, cancellationToken);
}
它与以下内容一起崩溃:
System.ArgumentNullException: Value cannot be null. (Parameter 'clientSecret')
at Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential..ctor(String clientId, String clientSecret)
at Microsoft.Bot.Connector.Authentication.MicrosoftAppCredentials.<BuildAuthenticator>b__16_0()
at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor)
at System.Lazy`1.CreateValue()
at System.Lazy`1.get_Value()
at Microsoft.Bot.Connector.Authentication.AppCredentials.<BuildIAuthenticator>b__36_0()
at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor)
at System.Lazy`1.CreateValue()
at System.Lazy`1.get_Value()
at Microsoft.Bot.Connector.Authentication.AppCredentials.GetTokenAsync(Boolean forceRefresh)
at Microsoft.Bot.Connector.Authentication.AppCredentials.ProcessHttpRequestAsync(HttpRequestMessage request, CancellationToken cancellationToken)
at Microsoft.Bot.Connector.Conversations.ReplyToActivityWithHttpMessagesAsync(String conversationId, String activityId, Activity activity, Dictionary`2 customHeaders, CancellationToken cancellationToken)
at Microsoft.Bot.Connector.ConversationsExtensions.ReplyToActivityAsync(IConversations operations, String conversationId, String activityId, Activity activity, CancellationToken cancellationToken)
at Microsoft.Bot.Builder.BotFrameworkAdapter.SendActivitiesAsync(ITurnContext turnContext, Activity[] activities, CancellationToken cancellationToken)
at Microsoft.Bot.Builder.TurnContext.<>c__DisplayClass31_0.<<SendActivitiesAsync>g__SendActivitiesThroughAdapter|1>d.MoveNext()
--- End of stack trace from previous location ---
at Microsoft.Bot.Builder.TurnContext.SendActivityAsync(IActivity activity, CancellationToken cancellationToken)
at iPMC.Autotest.DevOps.Bots.Bots.AutotestBot.OnMessageActivityAsync(ITurnContext`1 turnContext, CancellationToken cancellationToken)
我不知道为什么。根据文档,当使用用户分配的身份时,这在我的appsettings.json中应该足够了(AVALUE当然是我的真实值(:
"MicrosoftAppType": "UserAssignedMSI",
"MicrosoftAppId": "AVALUE",
"MicrosoftAppTenantId": "AVALUE",
"MicrosoftAppPassword": "",
"ConnectionName": "AVALUE"
似乎大多数例子也使用密码,所以我真的找不到其他人使用过这个。
我也尝试过在本地和部署,但在两个地方都遇到了相同的异常,所以我不知道下一步应该测试什么了。
还有谁在团队机器人中使用过UserAssignedMSI并使其发挥作用?
您需要生成客户端机密并将其存储在appsettings.json
文件中。
此处关于部署机器人程序的文档涵盖MSI机器人程序,并且似乎是最新的。我能够按照以下步骤将一个简单的MSI机器人部署到Azure。
你需要确保某些事情是一致的。机器人程序中的AppId应该是托管身份的ClientId,并且需要将托管身份正确分配给机器人程序。当您使用文档中提到的ARM模板进行部署时,将为您处理这些详细信息。