Ошибка канала бота Azure «Произошла ошибка отправки этого сообщения вашему боту: код состояния HTTP неавторизован»

#azure #asp.net-core #azure-active-directory #botframework #pulumi

#azure #asp.net-core #azure-active-directory #botframework #пулуми

Вопрос:

Я получаю несанкционированную ошибку при попытке отправить сообщение с канала бота Azure в api. Я развернул приложение Azure и канал бота с помощью pulumi. В приложении Azure я заметил, что в разделе аутентификации есть предупреждение о неявном предоставлении.

Неявное предоставление

Если я отключу настройку неявного предоставления на портале Azure, канал бота будет работать нормально. Я создаю приложение Azure с настройками по умолчанию в соответствии с документацией pulumi, но нет возможности удалить эти неявные настройки предоставления

Я создал приложение Azure и канал бота с помощью pulumi, используя эту ссылку

 public static AzureAD.Application Create()
{
    var name = "app-name";
    var azureApp = new AzureAD.Application(name, new AzureAD.ApplicationArgs
    {
        Name = name
        // Tried combinations of the following lines, but it makes no difference
        //, Type = "native"
        //, Oauth2AllowImplicitFlow = false
    });
    
    CreatePrincipal(azureApp);
    
    return azureApp;
}
    
private static void CreatePrincipal(AzureAD.Application azureApp)
{
    var name = "app-principal";
    new AzureAD.ServicePrincipal(name, new AzureAD.ServicePrincipalArgs
    {
        ApplicationId = azureApp.ApplicationId
    });
}

public static ChannelsRegistration Create(ResourceGroup resourceGroup, AzureAD.Application teamsBotAzureApp)
{
    var channelName = "Channel";
    var channel = new ChannelsRegistration(channelName, new ChannelsRegistrationArgs
    {
        Location = "global",
        ResourceGroupName = resourceGroup.Name,
        Sku = "F0",
        MicrosoftAppId = teamsBotAzureApp.ApplicationId,
        Endpoint = "https://azurefunction.com/api/BotMessagesHandler"
    });
    
    CreateChannel(resourceGroup, channel);
    
    return channel;
}

  

Комментарии:

1. Когда канал вызывает вашего бота, он отправляет заголовок аутентификации с токеном предъявителя. Процесс проверки и проверки этого токена объясняется здесь: learn.microsoft.com/azure/bot-service/rest-api /…

2. Я мало знаю о неявном предоставлении, но при беглом чтении не похоже, что это сработает для бота. Я понимаю, что неявный поток предоставления — это обмен между получателем и вызывающим абонентом. Службы канала, вызывающие вашего бота, не настроены для этого типа обмена, они настроены на отправку и получение токенов на предъявителя JWT, как описано выше. Что-то, что вы могли бы сделать, это отделить интерфейс от серверной части бота и опубликовать их отдельно.

3. Все это говорит о том, что если вы ориентируетесь только на прямой канал, расширение службы приложений может разрешить неявный поток предоставления, поскольку оно является расширением службы приложений и выполняется в контексте вашего приложения, которое может быть даже изолировано в виртуальной сети. Дополнительную информацию можно найти здесь: learn.microsoft.com/azure/bot-service /…

4. Вы отключили неявное предоставление от портала Azure, тогда канал бота работает нормально, так в чем ваш вопрос?

5. @JoyWang, поскольку я делаю это с помощью pulumi, я не хочу делать это вручную

Ответ №1:

В azure ad настройка Implicit Grant контролируется параметрами в Manifest (вы также можете установить их в пользовательском интерфейсе, тогда они будут изменены в манифесте), Access tokens соответствует oauth2AllowImplicitFlow , ID tokens соответствует oauth2AllowIdTokenImplicitFlow .

Если вы создаете приложение с помощью pulumi, вы можете настроить Oauth2AllowImplicitFlow = false отключение Access tokens , но, похоже oauth2AllowIdTokenImplicitFlow , во входных данных pulumi нет, поэтому вы не смогли отключить ID tokens через pulumi.

Вы можете попробовать обходные пути, приведенные ниже.

1. В предупреждении говорится You should remove these settings or register the appropriate redirect URI. , что вы можете попытаться создать приложение с URI перенаправления (т.Е. ReplyUrls ) с кодом, как показано ниже, посмотреть, работает ли оно без отключения ID tokens .

 ReplyUrls = 
            {
                "https://replyurl",
            }
  

2. Если оно принято, вы можете использовать Microsoft Graph SDK для обновления приложения после его создания. Установите значение enableIdTokenIssuance false в implicitGrantSettings web свойстве of, тогда ID tokens оно будет отключено.