Limitar o acesso ao Microsoft Teams quando os trabalhadores de linha de frente estiverem fora do turno

Visão Geral

O tempo de trabalho é um recurso que permite que os administradores limitem o acesso ao Microsoft Teams para trabalhadores por turnos em dispositivos móveis Android e iOS. Esses controles foram projetados para cenários BYOD (traga seu próprio dispositivo) ou de dispositivos dedicados de propriedade da empresa para funcionários da linha de frente. Saiba mais sobre cenários de dispositivos de linha de frente.

Com esse recurso, você pode bloquear o acesso ao Teams ou mostrar uma mensagem de aviso quando os trabalhadores de linha de frente que estão fora do turno abrirem o Teams. Considere habilitar o tempo de trabalho para sua força de trabalho de linha de frente se:

  • Você está preocupado com os trabalhadores da linha de frente que pedem pagamento fora do horário de trabalho se acessarem aplicativos de trabalho.
  • As leis e regulamentos locais exigem que você restrinja o acesso a aplicativos de trabalho quando os funcionários estiverem fora do turno.

Como funciona

Quando um trabalhador de linha de frente entra em seu turno e abre o Teams, o aplicativo verifica se o trabalhador está dentro ou fora do turno.

  • Se o trabalhador estiver no turno, ele poderá acessar o Teams.
  • Se o trabalhador estiver fora do turno quando o Teams estiver aberto, ele verá uma tela de bloqueio ou de aviso.
    • Se você configurou uma tela de bloqueio, o trabalhador não poderá acessar o Teams até que ele entre no turno.
    • Se você configurou uma tela de aviso, o trabalhador pode dispensá-la e escolher se deseja usar o Teams a seu critério.
  • Se um trabalhador estiver usando o Teams durante o registro de saída, ele verá uma tela de bloqueio ou aviso para o aplicativo depois de bater o ponto.

Captura de tela do bloqueio de acesso e da tela de aviso.

Juntamente com o tempo de trabalho, recomendamos que você também configure o tempo de silêncio para silenciar automaticamente as notificações do Teams quando os trabalhadores estiverem fora do turno.

Configurar o tempo de trabalho

Siga estas etapas para habilitar o tempo de trabalho para sua linha de frente.

Configurar políticas de proteção de aplicativo para Android e iOS

Use as políticas de proteção do aplicativo Microsoft Intune para configurar o horário de trabalho para bloquear ou avisar o acesso ao Teams em dispositivos Android e iOS. Para obter mais informações sobre configurações de política, consulte:

Conectar seu sistema de gerenciamento de força de trabalho (WFM) à API workingTimeSchedule

Criar um aplicativo

  1. Crie um aplicativo no Microsoft Entra para a API do Graph workingTimeSchedule.

    Ao registrar seu aplicativo, certifique-se de escolher a opção Contas somente neste diretório organizacional (locatário único) para que somente os usuários em seu locatário possam usar o aplicativo. Para saber mais, consulte Registrar um aplicativo na plataforma de identidade da Microsoft.

  2. Adicione a permissão de aplicativo oculto para chamar a API do Graph usando o escopo necessário, Schedule-WorkingTime.ReadWrite.All.

    1. Entre em seu aplicativo no portal do Azure.

    2. Vá para a guia Manifesto . Você verá um JSON que contém a definição completa do seu aplicativo.

    3. No final do manifesto, adicione a requiredResourceAccess propriedade.

      Essa propriedade especifica o conjunto de permissões ao qual seu aplicativo requer acesso. Em outras palavras, ele contém todas as APIs que seu aplicativo pode chamar. Se essa propriedade já estiver presente no manifesto, sua API já tem algumas permissões concedidas a ela.

    4. Dentro da requiredResourceAccess matriz, adicione um objeto com uma ID de 00000003-0000-0000-0000-c000-0000000000000000 para especificar permissões do aplicativo Graph.

      Se você já tiver um objeto com essa mesma ID dentro de sua requiredResourceAccess matriz, você só precisará adicionar o seguinte dentro da resourceAccess matriz:

      • Um objeto com a ID da nova permissão oculta, 0b21c159-dbf4-4dbb-a6f6-490e412c716e.
      • O tipo de permissão. Nesse caso, Role.

      Veja um exemplo de como seria a aparência do final do manifesto:

      {
        ...
        "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. Salve as alterações.

Você precisa ser um administrador de locatários para executar esta etapa.

  1. No navegador, vá para https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id={ClientAppId}& response_type=code&scope=https://graph.microsoft.com/.default.
  2. Na URL, substitua ClientAppId pela ID do aplicativo.
  3. Na caixa de diálogo de consentimento, escolha Aceitar para conceder consentimento de administrador em todo o locatário à nova permissão oculta do aplicativo.

Chame o Graph do aplicativo

Veja como chamar pontos de extremidade do Graph do aplicativo usando o código de exemplo em C#.

  1. Crie um novo projeto de console usando o SDK do .NET 6 ou do .NET 7.

  2. Instale o Microsoft.Identity.Client pacote NuGet.

  3. Abra o arquivo program.cs e copie e cole o seguinte código de exemplo nele:

        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. No código, altere o seguinte:

    • tenantId: substitua pela ID do locatário.
    • clientId: substitua pela ID do seu aplicativo.
    • clientSecret: Você deve adicionar um segredo do cliente na seção de autenticação do seu aplicativo. Você também pode optar por usar um certificado de segurança e alterar o código de acordo.
    • userId: Substitua pelo usuário ao qual você deseja aplicar a política inWorkingTime ou outOfWorkingTime.

Configurar o tempo de silêncio

Esta etapa é opcional, mas recomendada.

Configure políticas de tempo silencioso no Intune para silenciar automaticamente as notificações do Teams para trabalhadores de linha de frente durante o horário de folga. Saiba mais sobre como criar políticas de tempo de silêncio.

Perguntas frequentes

Preciso usar o aplicativo Turnos no Teams para aproveitar esse recurso?

Não, esse recurso depende do sinal de entrada/saída do seu WFM.

Posso usar o tempo de trabalho se não tiver um sistema de entrada / saída em vigor?

Não, é necessário um sinal de entrada/saída para usar esse recurso.