Condividi tramite


Limitare l'accesso a Microsoft Teams quando i lavoratori in prima linea sono fuori turno

Panoramica

L'orario di lavoro è una funzionalità che consente agli amministratori di limitare l'accesso a Microsoft Teams per i turnisti nei dispositivi mobili Android e iOS. Questi controlli sono progettati per scenari BYOD (Bring Your Own Device) o dispositivi dedicati di proprietà dell'azienda per i lavoratori in prima linea. Altre informazioni sugli scenari dei dispositivi in prima linea.

Con questa funzionalità è possibile bloccare l'accesso a Teams o visualizzare un messaggio di avviso quando i lavoratori in prima linea che sono fuori turno aprono Teams. Valutare la possibilità di abilitare l'orario di lavoro per la forza lavoro in prima linea se:

  • Si è preoccupati per i lavoratori in prima linea che chiedono di pagare al di fuori dell'orario di lavoro se accedono alle app di lavoro.
  • Le leggi e le normative locali richiedono di limitare l'accesso alle app aziendali quando i dipendenti sono fuori turno.

Come funziona

Quando un ruolo di lavoro in prima linea passa al turno e apre Teams, l'app controlla se il ruolo di lavoro è attivato o disattivato.

  • Se il ruolo di lavoro è in turno, può accedere a Teams.
  • Se il ruolo di lavoro è fuori turno quando Teams è aperto, il ruolo di lavoro visualizza una schermata di blocco o avviso.
    • Se è stata configurata una schermata di blocco, il ruolo di lavoro non può accedere a Teams finché non esegue l'orologio al turno.
    • Se è stata configurata una schermata di avviso, il ruolo di lavoro può ignorarla e scegliere se usare Teams a propria discrezione.
  • Se un ruolo di lavoro usa Teams durante l'uscita, il ruolo di lavoro visualizza una schermata di blocco o di avviso per l'app dopo il timeout.

Screenshot della schermata di accesso bloccato e della schermata di avviso.

Oltre all'orario di lavoro, è consigliabile configurare anche il tempo di inattività per disattivare automaticamente le notifiche di Teams quando i lavoratori sono fuori turno.

Configurare l'orario di lavoro

Seguire questa procedura per abilitare l'orario di lavoro per la prima linea.

Configurare i criteri di protezione delle app per Android e iOS

Usare Microsoft Intune criteri di protezione delle app per configurare l'orario di lavoro per bloccare o avvisare l'accesso a Teams nei dispositivi Android e iOS. Per altre informazioni sulle impostazioni dei criteri, vedere:

Connettere il sistema di gestione della forza lavoro (WFM) all'API workingTimeSchedule

Creare un'applicazione

  1. Creare un'applicazione in Microsoft Entra per il API Graph workingTimeSchedule.

    Quando si registra l'applicazione, assicurarsi di scegliere l'opzione Account solo in questa directory organizzativa (tenant singolo) in modo che solo gli utenti del tenant possano usare l'applicazione. Per altre informazioni, vedere Registrare un'applicazione con il Microsoft Identity Platform.

  2. Aggiungere l'autorizzazione dell'applicazione nascosta per chiamare il API Graph usando l'ambito richiesto, Schedule-WorkingTime.ReadWrite.All.

    1. Accedere all'applicazione nel portale di Azure.

    2. Passare alla scheda Manifesto . Verrà visualizzato un codice JSON che contiene la definizione completa dell'applicazione.

    3. Alla fine del manifesto aggiungere la requiredResourceAccess proprietà .

      Questa proprietà specifica il set di autorizzazioni a cui l'applicazione richiede l'accesso. In altre parole, contiene tutte le API che l'applicazione può chiamare. Se questa proprietà è già presente nel manifesto, all'API sono già state concesse alcune autorizzazioni.

    4. All'interno della requiredResourceAccess matrice aggiungere un oggetto con ID per 00000003-0000-0000-0000-c000-0000000000000000 specificare le autorizzazioni dell'applicazione Graph.

      Se si dispone già di un oggetto con questo stesso ID all'interno requiredResourceAccess della matrice, è sufficiente aggiungere quanto segue all'interno della resourceAccess matrice:

      • Oggetto con l'ID della nuova autorizzazione nascosta, 0b21c159-dbf4-4dbb-a6f6-490e412c716e.
      • Tipo di autorizzazione. In questo caso, Role.

      Ecco un esempio dell'aspetto della fine del 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. Salvare le modifiche.

Per eseguire questo passaggio, è necessario essere un amministratore tenant.

  1. Nel browser passare a https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id={ClientAppId}& response_type=code&scope=https://graph.microsoft.com/.default.
  2. Nell'URL sostituire ClientAppId con l'ID app.
  3. Nella finestra di dialogo di consenso scegliere Accetta per concedere il consenso amministratore a livello di tenant alla nuova autorizzazione nascosta per l'applicazione.

Chiamare Graph dall'applicazione

Ecco come chiamare gli endpoint Graph dall'applicazione usando codice di esempio in C#.

  1. Creare un nuovo progetto console usando .NET 6 o .NET 7 SDK.

  2. Installare il Microsoft.Identity.Client pacchetto NuGet.

  3. Aprire il file program.cs e copiarvi e incollarvi il codice di esempio seguente:

        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. Nel codice modificare quanto segue:

    • tenantId: sostituire con l'ID tenant.
    • clientId: sostituire con l'ID dell'applicazione.
    • clientSecret: è necessario aggiungere un segreto client nella sezione di autenticazione dell'applicazione. È anche possibile scegliere di usare un certificato di sicurezza e modificare il codice di conseguenza.
    • userId: sostituire con l'utente a cui si vuole applicare il criterio inWorkingTime o outOfWorkingTime.

Configurare l'ora non interattiva

Questo passaggio è facoltativo ma consigliato.

Configurare i criteri di tempo non lavorativo in Intune per disattivare automaticamente le notifiche di Teams per i lavoratori in prima linea durante le ore non lavorative. Altre informazioni su come creare criteri di tempo non interattiva.

Domande frequenti

È necessario usare l'app Turni in Teams per sfruttare questa funzionalità?

No, questa funzionalità si basa sul segnale di entrata/uscita del WFM.

È possibile usare l'orario di lavoro se non si dispone di un sistema di entrata/uscita?

No, per usare questa funzionalità è necessario un segnale di entrata/uscita.