我已经在Visual Studio 2017中创建了Bot应用程序,希望在MS Teams中使用。该应用程序是解决方案的一部分,该解决方案包含2个组件,即bot应用程序本身和Windows应用程序,它们是由我创建的,由bot应用程序用来从Microsoft检索身份验证令牌(使用与本网站类似的代码https://docs.microsoft.com/en-us/azure/active-directory/develop/guidedsetups/active-directory-uwp-v2)。
在本地托管机器人后对其进行调试时,我可以在Teams中成功使用该机器人。没有错误。但是,既然我已经在Azure的Microsoft Bot Framework中注册了该机器人,当Teams返回消息“抱歉,我的机器人代码有问题”时,我现在遇到了问题。在Azure中,我有一个Bots Channels Registration实体,该实体的设置指向一个消息传递终结点,该终结点为https://.azurewebsites.net/api/messages。我也有一个Apps服务。现在,我已经转移了在Microsoft Bot Framework中注册机器人时收到的应用程序ID,并将其连同应用程序密码一起放入web.config文件中Visual Studio中的机器人应用程序中。
在Bot Framework模拟器中对此进行测试后,我得到“ POST 401 directline.postActivity”,在“ Inspector-JSON”中得到“ BotAuthenticator无法验证传入请求!”。这是我的第一个机器人应用程序,所以我迷失了我可能错过的东西,所以有人知道我可以尝试什么吗?
这就是RootDialog.cs文件中的内容,使用机器人时端点将在该文件中命中
。private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
{
var activity = await result as Activity;
string userInfo = "";
AuthTokenDeploy tokenDeploy = new AuthTokenDeploy();
userInfo = await tokenDeploy.MsGraphUserInfo();
if(!userInfo.Equals(""))
{
// send webhook to end user system
await SendToEndpoint(context, activity, activity.Text,
userInfo);
}
}
AuthTokenDeploy是另一个类的实例,在该类中拥有从Microsoft获取访问令牌以及用户信息的功能。因此,我创建了一个字符串“ userInfo”,该字符串随后使用了MsGraphUserInfo()给出的值。
public async Task<string> MsGraphUserInfo()
{
AuthenticationResult authResult = null;
string Text = null;
try
{
authResult = await App.PublicClientApp.AcquireTokenSilentAsync(_scopes, App.PublicClientApp.Users.FirstOrDefault());
}
catch (MsalUiRequiredException ex)
{
// A MsalUiRequiredException happened on AcquireTokenSilentAsync. This indicates you need to call AcquireTokenAsync to acquire a token
System.Diagnostics.Debug.WriteLine($"MsalUiRequiredException: {ex.Message}");
try
{
authResult = await App.PublicClientApp.AcquireTokenAsync(_scopes);
}
catch (MsalException msalex)
{
}
}
catch (Exception ex)
{
}
if (authResult != null)
{
Text = await GetHttpContentWithToken(_graphAPIEndpoint, authResult.AccessToken);
}
return Text;
}
调用MsGraphUserInfo()将打开“ AuthToken.exe”作为弹出窗口,并要求用户使用其凭据登录。您可以从上面的代码中看到,它首先获取访问令牌,然后将其传递到GetHttpContentWithToken()中,在此处对“ https://graph.microsoft.com/v1.0/me”运行HTTP GET请求,并向用户返回JSON字符串其中的信息。
public async Task<string> GetHttpContentWithToken(string url, string token)
{
var httpClient = new System.Net.Http.HttpClient();
System.Net.Http.HttpResponseMessage response;
try
{
var request = new System.Net.Http.HttpRequestMessage(System.Net.Http.HttpMethod.Get, url);
//Add the token in Authorization header
request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
response = await httpClient.SendAsync(request);
var content = await response.Content.ReadAsStringAsync();
return content;
}
catch (Exception ex)
{
return ex.ToString();
}
}
现在,我觉得这种使用Windows应用程序允许用户登录的方法可能不是最好的方法,因此,为什么我一直在阅读并遵循本指南https://docs.microsoft.com/en-us/azure/app-service/app-service-web-tutorial-auth-aad。我想知道是否可以使用此页面上的内容来允许我的机器人检索访问令牌?