Compartir a través de


Limitar el acceso a Microsoft Teams cuando los trabajadores de primera línea están fuera del turno

Información general

El tiempo de trabajo es una característica que permite a los administradores limitar el acceso a Microsoft Teams para los trabajadores por turnos en dispositivos móviles Android e iOS. Estos controles están diseñados para escenarios de dispositivos dedicados de empresa o bring-your-own-device (BYOD) para trabajadores de primera línea. Obtenga más información sobre los escenarios de dispositivos de primera línea.

Con esta característica, puede bloquear el acceso a Teams o mostrar un mensaje de advertencia cuando los trabajadores de primera línea que están fuera del turno abren Teams. Considere la posibilidad de habilitar el tiempo de trabajo para los empleados de primera línea si:

  • Le preocupa que los trabajadores de primera línea pidan pago fuera del horario laboral si acceden a las aplicaciones de trabajo.
  • Las leyes y regulaciones locales requieren que restrinja el acceso a las aplicaciones de trabajo cuando los empleados están fuera del turno.

Cómo funciona

Cuando un trabajador de primera línea marca el reloj en su turno y abre Teams, la aplicación comprueba si el trabajo está activado o desactivado.

  • Si el trabajador está de turno, puede acceder a Teams.
  • Si el trabajo está fuera del turno cuando Teams está abierto, el trabajador ve una pantalla de bloqueo o advertencia.
    • Si configuró una pantalla de bloqueo, el trabajador no podrá acceder a Teams hasta que se alojen en su turno.
    • Si configuró una pantalla de advertencia, el trabajador puede descartarla y elegir si desea usar Teams a su discreción.
  • Si un trabajador usa Teams mientras se agota el tiempo de espera, el trabajador ve una pantalla de bloqueo o advertencia para la aplicación después de que se agote el reloj.

Captura de pantalla de la pantalla de acceso a bloques y la pantalla de advertencia.

Junto con el tiempo de trabajo, se recomienda configurar también el tiempo de silencio para silenciar automáticamente las notificaciones de Teams cuando los trabajadores están fuera del turno.

Configurar el tiempo de trabajo

Siga estos pasos para habilitar el tiempo de trabajo para la primera línea.

Configuración de directivas de protección de aplicaciones para Android e iOS

Use Microsoft Intune directivas de protección de aplicaciones para configurar el tiempo de trabajo para bloquear o advertir el acceso a Teams en dispositivos Android e iOS. Para obtener más información sobre la configuración de directivas, consulte:

Conexión del sistema de administración del personal (WFM) a la API workingTimeSchedule

Creación de una aplicación

  1. Cree una aplicación en Microsoft Entra para el Graph API workingTimeSchedule.

    Al registrar la aplicación, asegúrese de elegir la opción Cuentas solo en este directorio organizativo (inquilino único) para que solo los usuarios del inquilino puedan usar la aplicación. Para más información, consulte Registro de una aplicación con el Plataforma de identidad de Microsoft.

  2. Agregue el permiso de aplicación oculto para llamar al Graph API mediante el ámbito necesario, Schedule-WorkingTime.ReadWrite.All.

    1. Inicie sesión en la aplicación en el Azure Portal.

    2. Vaya a la pestaña Manifiesto . Verá un JSON que contiene la definición completa de la aplicación.

    3. Al final del manifiesto, agregue la requiredResourceAccess propiedad .

      Esta propiedad especifica el conjunto de permisos a los que la aplicación requiere acceso. En otras palabras, contiene todas las API a las que la aplicación puede llamar. Si esta propiedad ya está presente en el manifiesto, la API ya tiene algunos permisos concedidos.

    4. Dentro de la requiredResourceAccess matriz, agregue un objeto con un identificador de 00000003-0000-0000-0000-c000-0000000000000000 para especificar los permisos de la aplicación Graph.

      Si ya tiene un objeto con este mismo identificador dentro de la requiredResourceAccess matriz, solo tendrá que agregar lo siguiente dentro de la resourceAccess matriz:

      • Objeto con el identificador del nuevo permiso oculto, 0b21c159-dbf4-4dbb-a6f6-490e412c716e.
      • Tipo de permiso. En este caso, Role.

      Este es un ejemplo del aspecto que podría tener el final del manifiesto:

      {
        ...
        "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. Guarde los cambios.

Debe ser administrador de un espacio empresarial para realizar este paso.

  1. En el explorador, vaya a https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id={ClientAppId}& response_type=code&scope=https://graph.microsoft.com/.default.
  2. En la dirección URL, reemplace por ClientAppId el identificador de la aplicación.
  3. En el cuadro de diálogo de consentimiento, elija Aceptar para conceder el consentimiento del administrador de todo el inquilino al nuevo permiso oculto para la aplicación.

Llamar a Graph desde la aplicación

A continuación se muestra cómo llamar a los puntos de conexión de Graph desde la aplicación mediante código de ejemplo en C#.

  1. Cree un nuevo proyecto de consola con el SDK de .NET 6 o .NET 7.

  2. Instale el Microsoft.Identity.Client paquete NuGet.

  3. Abra el archivo program.cs y copie y pegue el código de ejemplo siguiente en él:

        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. En el código, cambie lo siguiente:

    • tenantId: reemplace por el identificador de inquilino.
    • clientId: reemplace por el identificador de la aplicación.
    • clientSecret: debe agregar un secreto de cliente en la sección de autenticación de la aplicación. También puede optar por usar un certificado de seguridad y cambiar el código en consecuencia.
    • userId: reemplace por el usuario al que desea aplicar la directiva inWorkingTime o outOfWorkingTime.

Configuración del tiempo de silencio

Este paso es opcional, pero se recomienda.

Configure directivas de tiempo de silencio en Intune para silenciar automáticamente las notificaciones de Teams para los trabajadores de primera línea durante horas no laborables. Obtenga más información sobre cómo crear directivas de tiempo de silencio.

Preguntas frecuentes

¿Tengo que usar la aplicación Turnos en Teams para aprovechar esta característica?

No, esta característica se basa en la señal de entrada y salida del reloj de la WFM.

¿Puedo usar el tiempo de trabajo si no tengo un sistema de entrada y salida del reloj en su lugar?

No, se requiere una señal de entrada y salida del reloj para usar esta característica.