Поддержка единого входного знака для расширений обмена сообщениями

Поддержка единого входного (SSO) теперь доступна для расширений обмена сообщениями и разгрузки ссылок. Включение единого входа для расширений обмена сообщениями по умолчанию обновляет маркер проверки подлинности, что минимизирует количество раз, необходимых для ввода входа в учетные данные для Microsoft Teams.

В этом документе вы можете узнать, как включить SSO и при необходимости сохранить маркер проверки подлинности.

Предварительные требования

Необходимое условие, чтобы включить SSO для расширения обмена сообщениями и разгрузки ссылок:

  • У вас должна быть учетная запись Azure.
  • Необходимо настроить приложение через портал AAD, а также обновить Teams, как определено в регистрации приложения на портале AAD.

Примечание

Дополнительные сведения о создании учетной записи Azure и обновлении манифеста приложения см. в документе Поддержка единого входного знака (SSO) для ботов.

После завершения необходимых условий можно включить SSO для расширения сообщений и разгрузку ссылок.

Чтобы включить SSO

  1. Обновите сведения о подключении ботов к OAuth на портале Azure.

  2. Скачайте пример расширений обмена сообщениями и следуйте инструкциям по настройке, предоставленным мастером.

    Примечание

    Использование подключения OAuth для ботов при настройке расширений обмена сообщениями.

  3. В файле TeamsMessagingExtensionsSearchAuthConfigBot.cs обновите значение от auth до silentAuth в OnTeamsMessagingExtensionQueryAsync файле and/or OnTeamsAppBasedLinkQueryAsync .

    Примечание

    Мы не поддерживаем другие обработчики SSO, за исключением файла OnTeamsMessagingExtensionQueryAsync OnTeamsAppBasedLinkQueryAsync TeamsMessagingExtensionsSearchAuthConfigBot.cs.

  4. Вы получаете маркер в обработнике в полезной нагрузке или в зависимости от того, в какой сценарий вы включаете OnTeamsMessagingExtensionQueryAsync turnContext.Activity.Value OnTeamsAppBasedLinkQueryAsync SSO для:

    JObject valueObject=JObject.FromObject(turnContext.Activity.Value);
    if(valueObject["authentication"] !=null)
     {
        JObject authenticationObject=JObject.FromObject(valueObject["authentication"]);
        if(authenticationObject["token"] !=null)
     }
    
    

    Если вы используете подключение OAuth, добавьте следующий код в файл TeamsMessagingExtensionsSearchAuthConfigBot.cs для обновления или добавления маркера в магазине:

    protected override async Task<InvokeResponse> OnInvokeActivityAsync(ITurnContext<IInvokeActivity> turnContext, CancellationToken cancellationToken)
         {
             JObject valueObject = JObject.FromObject(turnContext.Activity.Value);
             if (valueObject["authentication"] != null)
             {
                 JObject authenticationObject = JObject.FromObject(valueObject["authentication"]);
                 if (authenticationObject["token"] != null)
                 {
                     //If the token is NOT exchangeable, then return 412 to require user consent
                     if (await TokenIsExchangeable(turnContext, cancellationToken))
                     {
                         return await base.OnInvokeActivityAsync(turnContext, cancellationToken).ConfigureAwait(false);
                     }
                     else
                     {
                         var response = new InvokeResponse();
                         response.Status = 412;
                         return response;
                     }
                 }
             }
             return await base.OnInvokeActivityAsync(turnContext, cancellationToken).ConfigureAwait(false);
         }
         private async Task<bool> TokenIsExchangeable(ITurnContext turnContext, CancellationToken cancellationToken)
         {
             TokenResponse tokenExchangeResponse = null;
             try
             {
                 JObject valueObject = JObject.FromObject(turnContext.Activity.Value);
                 var tokenExchangeRequest =
                 ((JObject)valueObject["authentication"])?.ToObject<TokenExchangeInvokeRequest>();
                 var userTokenClient = turnContext.TurnState.Get<UserTokenClient>();
                 tokenExchangeResponse = await userTokenClient.ExchangeTokenAsync(
                                 turnContext.Activity.From.Id,
                                  _connectionName,
                                  turnContext.Activity.ChannelId,
                                  new TokenExchangeRequest
                  {
                      Token = tokenExchangeRequest.Token,
                  },
                   cancellationToken).ConfigureAwait(false);
             }
     #pragma warning disable CA1031 //Do not catch general exception types (ignoring, see comment below)
             catch
     #pragma warning restore CA1031 //Do not catch general exception types
             {
                 //ignore exceptions
                 //if token exchange failed for any reason, tokenExchangeResponse above remains null, and a failure invoke response is sent to the caller.
                 //This ensures the caller knows that the invoke has failed.
             }
             if (tokenExchangeResponse == null || string.IsNullOrEmpty(tokenExchangeResponse.Token))
             {
                 return false;
             }
             return true;
         }
    
    

См. также