Partager via


Fournir des étiquettes de confidentialité à Recall avec UserActivityContentInfo

Windows Recall évalue les métadonnées JSON fournies UserActivity.ContentInfo pour décider s’il faut capturer une fenêtre et comment classifier des instantanés sous des stratégies DLP (Data Loss Prevention) d’entreprise. En fournissant des étiquettes de confidentialité (lorsqu’elles sont connues), Recall vous pouvez interroger le fournisseur DLP pour obtenir des décisions d’application (par exemple, bloquer la capture) et afficher les métadonnées appropriées aux utilisateurs.

Quand envoyer des métadonnées

Envoyez ou mettez à jour un UserActivity lorsque :

  • Modifications apportées au document ou à l’élément actif
  • Une étiquette de confidentialité est ajoutée, supprimée ou modifiée
  • Transitions d’état indéterminées à connues
  • Votre application démarre (pour établir une base de référence)

Modèle de sensibilité

Votre application peut signaler du contenu dans l’un des trois états suivants :

  1. Sensible : Inclure l’objet informationProtection avec un tableau labels
  2. Non sensible : omettez entièrement l’objet informationProtection
  3. Indéterminé : Include informationProtection.state = "undetermined" (Recall bloque la capture jusqu’à ce que l’état soit résolu)

L'absence de l'objet informationProtection signifie que le contenu n’est pas confidentiel.

Structure JSON

Champs de niveau supérieur recommandés :

  • @context: https://schema.org
  • @type: par exemple, « DocumentObject », « Event », « Article »
  • identifier : Identifiant stable et unique

Objet de protection des informations (pour les données sensibles ou indéterminées uniquement) motif (illustration, et non JSON littéral) :

"informationProtection": {
  "@type": "SensitivityLabel",
  "state": "<state>",              // "sensitive" or "undetermined"
  "labels": [                       // include only when state == "sensitive"
    {
      "labelID": "<label GUID>",
      "organizationID": "<tenant GUID>"
    }
  ]
}

Règlement:

  • Remplacez <state> par sensitive ou undetermined.
  • Incluez le tableau uniquement lorsque l’état labels est sensitive.
  • L'intérieur de l'objet @type est toujours SensitivityLabel.
  • Plusieurs étiquettes autorisées ; Recall applique l'étiquette la plus restrictive retournée par le fournisseur DLP.

Exemples minimaux

Sensible (unique) :

{
  "@context": "https://schema.org",
  "@type": "DocumentObject",
  "identifier": "doc-123",
  "informationProtection": {
    "@type": "SensitivityLabel",
    "state": "sensitive",
    "labels": [
      {
        "labelID": "F96E0B19-8C3A-4D5A-8B9A-2E8CFC43247B",
        "organizationID": "D3FE4C20-9C77-45AB-A8E7-9870D3C9C856"
      }
    ]
  }
}

Non sensible

{
  "@context": "https://schema.org",
  "@type": "DocumentObject",
  "identifier": "doc-123"
}

Indéterminé

{
  "@context": "https://schema.org",
  "@type": "DocumentObject",
  "identifier": "doc-123",
  "informationProtection": {
    "@type": "SensitivityLabel",
    "state": "undetermined"
  }
}

Exemple d’étiquettes multiples

"informationProtection": {
  "@type": "SensitivityLabel",
  "state": "sensitive",
  "labels": [
    {
      "labelID": "F96E0B19-8C3A-4D5A-8B9A-2E8CFC43247B",
      "organizationID": "D3FE4C20-9C77-45AB-A8E7-9870D3C9C856"
    },
    {
      "labelID": "9A724CF8-E7D2-4B1C-8F4A-1D2E7B3A6C8D",
      "organizationID": "7C56AB24-9E32-44FA-B7D8-1E9F43C7A92B"
    }
  ]
}

Utilisation de l’API (C#)

Méthode auxiliaire

La méthode d'assistance suivante démontre comment mettre à jour ContentInfo avec des étiquettes de confidentialité :

private async Task UpdateContentInfoAsync(
    string contentId,
    string state, // "sensitive" | "undetermined" | "none"
    IEnumerable<(string LabelId, string OrgId)>? labels = null)
{
    var channel = UserActivityChannel.GetDefault();
    var activity = await channel.GetOrCreateUserActivityAsync(contentId);
    activity.ActivationUri = new Uri($"my-app://content/{contentId}");

    string json;
    if (state == "sensitive" && labels != null)
    {
        var labelItems = string.Join(",",
            labels.Select(l => $@"{{ \"labelID\": \"{l.LabelId}\", \"organizationID\": \"{l.OrgId}\" }}"));
        json = $@"{{
  \"@context\": \"https://schema.org\",
  \"@type\": \"DocumentObject\",
  \"identifier\": \"{contentId}\",
  \"informationProtection\": {{
    \"@type\": \"SensitivityLabel\",
    \"state\": \"sensitive\",
    \"labels\": [ {labelItems} ]
  }}
}}";
    }
    else if (state == "undetermined")
    {
        json = $@"{{
  \"@context\": \"https://schema.org\",
  \"@type\": \"DocumentObject\",
  \"identifier\": \"{contentId}\",
  \"informationProtection\": {{
    \"@type\": \"SensitivityLabel\",
    \"state\": \"undetermined\"
  }}
}}";
    }
    else
    {
        json = $@"{{
  \"@context\": \"https://schema.org\",
  \"@type\": \"DocumentObject\",
  \"identifier\": \"{contentId}\"
}}";
    }

    activity.ContentInfo = UserActivityContentInfo.FromJson(json);
    await activity.SaveAsync();
}

Gestionnaire d’extraction

Le gestionnaire de récupération suivant montre comment répondre aux demandes sur demande UserActivity :

private async void UserActivityRequested(
    UserActivityRequestManager sender,
    UserActivityRequestedEventArgs args)
{
    var deferral = args.GetDeferral();
    try
    {
        string id = GetCurrentContentId();
        var (state, labels) = GetCurrentSensitivity(); // app logic
        var channel = UserActivityChannel.GetDefault();
        var activity = await channel.GetOrCreateUserActivityAsync(id);
        activity.ActivationUri = new Uri($"my-app://content/{id}");
        string json = BuildContentInfoJson(id, state, labels);
        activity.ContentInfo = UserActivityContentInfo.FromJson(json);
        args.Request.SetUserActivity(activity);
    }
    finally
    {
        deferral.Complete();
    }
}

Push et pull

Adoptez une approche hybride :

  • L’extraction initiale établit la ligne de référence
  • Envoyer des mises à jour immédiatement sur les modifications

Avantages : faible latence, évite les étiquettes obsolètes, réduit la surcharge d’interrogation, prend en charge la capture rapide à la demande.