Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
System Windows Recall ocenia metadane JSON dostarczone za pomocą UserActivity.ContentInfo, aby zdecydować, czy należy przechwycić okno i jak klasyfikować migawki pod kątem zasad zapobiegania utracie danych (DLP) przedsiębiorstwa. Po podaniu etykiet poufności (gdy są znane), Recall może wysłać zapytanie do dostawcy DLP w celu podejmowania decyzji dotyczących polityki (na przykład blokowania przechwytywania) i wyświetlić odpowiednie metadane dla użytkowników.
Kiedy wysyłać metadane
Wyślij lub zaktualizuj polecenie UserActivity , gdy:
- Aktywny dokument lub element zmienia się
- Etykieta poufności jest dodawana, usuwana lub zmieniana
- Przejścia stanu z nieokreślonego do znanego
- Aplikacja zostanie uruchomiona (aby ustanowić punkt odniesienia)
Model wrażliwości
Aplikacja może zgłaszać zawartość w jednym z trzech stanów:
-
Wrażliwe: dołącz
informationProtectionobiekt z tablicąlabels -
Niewrażliwe: całkowicie pomiń
informationProtectionobiekt -
Nieokreślone: Dołącz
informationProtection.state = "undetermined"(Recall bloki przechwytują dane do momentu, gdy stan zostanie rozwiązany)
Brak informationProtection obiektu oznacza, że zawartość nie jest wrażliwa.
Struktura JSON
Zalecane pola najwyższego poziomu:
-
@context:https://schema.org -
@type: Na przykład "DocumentObject", "Event", "Article" -
identifier: Stabilny unikatowy identyfikator
Wzorzec obiektu ochrony informacji (tylko dla poufnych lub nieokreślonych): (ilustracyjny, a nie literał JSON)
"informationProtection": {
"@type": "SensitivityLabel",
"state": "<state>", // "sensitive" or "undetermined"
"labels": [ // include only when state == "sensitive"
{
"labelID": "<label GUID>",
"organizationID": "<tenant GUID>"
}
]
}
Zasady:
- Zastąp ciąg
<state>ciągiemsensitivelubundetermined. - Dołącz tablicę
labelstylko wtedy, gdy stan tosensitive. -
@typewewnątrz obiektu jest zawszeSensitivityLabel. - Dozwolone jest użycie wielu etykiet; Recall stosuje najbardziej restrykcyjną, zwróconą przez dostawcę DLP.
Minimalne przykłady
Wrażliwe (pojedyncze):
{
"@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"
}
]
}
}
Niewrażliwe
{
"@context": "https://schema.org",
"@type": "DocumentObject",
"identifier": "doc-123"
}
Nieokreślone
{
"@context": "https://schema.org",
"@type": "DocumentObject",
"identifier": "doc-123",
"informationProtection": {
"@type": "SensitivityLabel",
"state": "undetermined"
}
}
Przykład wielu etykiet
"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"
}
]
}
Użycie interfejsu API (C#)
Metoda pomocnicza
Poniższa metoda pomocnicza pokazuje, jak zaktualizować ContentInfo przy użyciu etykiet poufności.
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();
}
Procedura obsługi ściągania
Poniższy handler pobierania demonstruje, jak reagować na żądania dynamiczne 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();
}
}
Wypychanie a ściąganie
Przyjęcie podejścia hybrydowego:
- Początkowe ściąganie ustanawia punkt odniesienia
- Przesyłanie aktualizacji natychmiast po wprowadzeniu zmian.
Korzyści: małe opóźnienia, unika nieaktualnych etykiet, zmniejsza obciążenie sondowania, obsługuje szybkie przechwytywanie na żądanie.
Powiązane linki
Windows developer