Ограничение доступа к Microsoft Teams, когда сотрудники первой линии работают вне смены

Обзор

Рабочее время — это функция, которая позволяет администраторам ограничить доступ к Microsoft Teams для сменных рабочих на мобильных устройствах Android и iOS. Эти элементы управления предназначены для сценариев использования собственных устройств (BYOD) или выделенных устройств, принадлежащих компании, для сотрудников первой линии. Узнайте больше о сценариях устройств с интерфейсом.

С помощью этой функции вы можете заблокировать доступ к Teams или отобразить предупреждающее сообщение, когда сотрудники, которые работают вне смены, открывают Teams. Рассмотрите возможность включения рабочего времени для сотрудников первой линии, если:

  • Вы обеспокоены тем, что сотрудники первой линии просят платить в нерабочее время, если они получают доступ к рабочим приложениям.
  • Местные законы и нормативные акты требуют, чтобы вы ограничивали доступ к рабочим приложениям, когда сотрудники находятся вне смены.

Принципы действия

Когда сотрудник первой линии входит в свою смену и открывает Teams, приложение проверяет, включена ли или отключена рабочая роль.

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

Снимок экрана: экран блокировки доступа и экран предупреждения.

Наряду с рабочим временем рекомендуется также настроить тихое время, чтобы автоматически отключать уведомления Teams, когда рабочие находятся вне смены.

Настройка рабочего времени

Выполните следующие действия, чтобы включить рабочее время для линии фронта.

Настройка политик защиты приложений для Android и iOS

Используйте политики защиты приложений Microsoft Intune, чтобы настроить рабочее время для блокировки или предупреждения доступа к Teams на устройствах Android и iOS. Дополнительные сведения о параметрах политики см. в разделе:

Подключение системы управления персоналом (WFM) к API workingTimeSchedule

Создание приложения

  1. Создайте приложение в Microsoft Entra для API Graph workingTimeSchedule.

    При регистрации приложения убедитесь, что выбран параметр Учетные записи только в этом каталоге организации (один клиент), чтобы приложение могли использовать только пользователи в вашем клиенте. Дополнительные сведения см. в статье Регистрация приложения с помощью платформа удостоверений Майкрософт.

  2. Добавьте скрытое разрешение приложения для вызова API Graph с помощью необходимого область , Schedule-WorkingTime.ReadWrite.All.

    1. Войдите в приложение в портал Azure.

    2. Перейдите на вкладку Манифест . Вы увидите JSON, содержащий полное определение приложения.

    3. В конце манифеста добавьте requiredResourceAccess свойство .

      Это свойство указывает набор разрешений, к которым приложению требуется доступ. Иными словами, он содержит все API, которые может вызывать приложение. Если это свойство уже присутствует в манифесте, api уже имеет некоторые разрешения.

    4. Внутри массива requiredResourceAccess добавьте объект с идентификатором 00000003-0000-0000-0000-c000-0000000000000000 , чтобы указать разрешения приложения Graph.

      Если у вас уже есть объект с таким же идентификатором в requiredResourceAccess массиве, необходимо добавить в массив только следующее resourceAccess :

      • Объект с идентификатором нового скрытого разрешения . 0b21c159-dbf4-4dbb-a6f6-490e412c716e
      • Тип разрешения. В этом случае — Role.

      Ниже приведен пример того, как может выглядеть конец манифеста:

      {
        ...
        "preAuthorizedApplications": [],
        "publisherDomain": "microsoft.onmicrosoft.com",
        "replyUrlsWithType": [
          {
            "url": "https://localhost:44321/signin-oidc",
            "type": "Web"
          },
          {
            "url": "https://localhost:44321/",
            "type": "Web"
          }
        ],
        "requiredResourceAccess": [
          {
            "resourceAppId": "00000003-0000-0000-c000-000000000000",
            "resourceAccess": [
              {
                "id": "0b21c159-dbf4-4dbb-a6f6-490e412c716e",
                "type": "Role"
              }
            ]
          }
        ],
        "samlMetadataUrl": null,
        "signInUrl": null,
        "signInAudience": "AzureADMyOrg",
        "tags": [],
        "tokenEncryptionKeyId": null
      }
      
    5. Сохраните изменения.

Вы должны быть администратором клиента, чтобы выполнить это действие.

  1. В браузере перейдите по адресу https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id={ClientAppId}& response_type=code&область=https://graph.microsoft.com/.default.
  2. В URL-адресе замените ClientAppId идентификатором приложения.
  3. В диалоговом окне согласия выберите Принять , чтобы предоставить согласие администратора на уровне клиента для нового скрытого разрешения для приложения.

Вызов Graph из приложения

Ниже описано, как вызвать конечные точки Graph из приложения с помощью примера кода в C#.

  1. Создайте проект консоли с помощью пакета SDK для .NET 6 или .NET 7.

  2. Microsoft.Identity.Client Установите пакет NuGet.

  3. Откройте файл program.cs, скопируйте и вставьте в него следующий пример кода:

        using System.Text;
      using Microsoft.Identity.Client;
      var userId = "928bf23a-81e8-47c9-ad54-2c0206248afe";
      var path = Path.Combine(Path.GetTempPath(),
      "workingTimeTokenGenerator.txt");
    
      string? accessToken;
      if (!File.Exists(path) || (DateTime.UtcNow - new
      FileInfo(path).LastWriteTimeUtc).TotalMinutes > 59)
      {
        var clientId = "00001111-aaaa-2222-bbbb-3333cccc4444";
        var clientSecret = "Aa1Bb~2Cc3.-Dd4Ee5Ff6Gg7Hh8Ii9_Jj0Kk1Ll2";
        var tenantId = "cad3e174-69d3-4707-abd2-f527f45c367a";
        var scopes = new string[] { "00000003-0000-0000-c000-000000000000/.default" };
    
        var app = ConfidentialClientApplicationBuilder.Create(clientId)
          .WithClientSecret(clientSecret)
          .Build();
    
        var result = await app.AcquireTokenForClient(scopes)
          .WithAuthority(AzureCloudInstance.AzurePublic, tenantId)
          .ExecuteAsync();
    
        accessToken = result.AccessToken;
        File.WriteAllText(path, accessToken);
      }
      else
      {
        accessToken = File.ReadAllText(path);
      }
    
      int number;
    
      while (true)
      {
        Console.WriteLine("Press 1 for startWorkingTime, 2 for endWorkingTime.");
        var choice = Console.ReadLine();
        if (!Int32.TryParse(choice, out number) || !new[] { 1, 2}.Contains(number))
        {
          Console.WriteLine("Out-of-range election.");
          continue;
        }
    
        break;
      }
    
      Console.WriteLine("Performing request...");
      var httpClient = new HttpClient();
      var message = new HttpRequestMessage
      {
        Method = HttpMethod.Post,
        RequestUri = new
      Uri($"https://graph.microsoft.com/beta/users/{userId}/solutions/schedule/{(number == 1 ? "startWorkingTime" : "endWorkingTime")}")
      };
      message.Headers.Add("Authorization", $"Bearer {accessToken}");
      message.Content = new StringContent("", Encoding.UTF8,
      "application/json");
      var response = await httpClient.SendAsync(message);
      if (!response.IsSuccessStatusCode)
      {
        string? content = null;
        try
        {
          content = await response.Content?.ReadAsStringAsync();
        }
        catch
        {
        }
    
        Console.WriteLine($"Graph returned a non success status code: 
      {response.StatusCode}. Reason phrase: {response.ReasonPhrase}." +
          (content is null ? "Unable to get the response body." :
      $"Content: {content}"));
      }
      else
      {
        Console.WriteLine($"Graph returned a success status code: 
      {response.StatusCode}.");
      }
    
      Console.WriteLine("Press any key to exit.");
      _ = Console.ReadKey();
    
  4. В коде измените следующее:

    • tenantId: замените идентификатором клиента.
    • clientId: замените идентификатором приложения.
    • clientSecret: необходимо добавить секрет клиента в раздел проверки подлинности приложения. Вы также можете использовать сертификат безопасности и соответствующим образом изменить код.
    • userId: замените пользователем, к которому требуется применить политику inWorkingTime или outOfWorkingTime.

Настройка спокойного времени

Этот шаг необязателен, но рекомендуется.

Настройте политики спокойного времени в Intune, чтобы автоматически отключать уведомления Teams для сотрудников первой линии в нерабочее время. Узнайте больше о создании политик спокойного времени.

Вопросы и ответы

Нужно ли использовать приложение "Смены" в Teams, чтобы воспользоваться преимуществами этой функции?

Нет, эта функция зависит от часового сигнала от WFM.

Можно ли использовать рабочее время, если у меня нет системы ввода и выхода часов?

Нет, для использования этой функции требуется сигнал с часовым вводом и выходом.