Panduan pengembang Perlindungan Informasi Windows (WIP)
Aplikasi tercerahkan membedakan antara data perusahaan dan pribadi dan mengetahui mana yang harus dilindungi berdasarkan kebijakan Perlindungan Informasi Windows (WIP) yang ditentukan oleh administrator.
Dalam panduan ini, kami akan menunjukkan kepada Anda cara membuatnya. Setelah selesai, administrator kebijakan akan dapat memercayai aplikasi Anda untuk menggunakan data organisasi mereka. Dan karyawan akan senang bahwa Anda telah menyimpan data pribadi mereka tetap utuh di perangkat mereka bahkan jika mereka tidak mendaftar dari manajemen perangkat seluler (MDM) organisasi atau meninggalkan organisasi sepenuhnya.
Catatan Panduan ini membantu Anda mencerahkan aplikasi UWP. Jika Anda ingin mencerahkan aplikasi desktop C++ Windows, lihat Panduan pengembang Perlindungan Informasi Windows (WIP) (C++).
Anda dapat membaca lebih lanjut tentang WIP dan aplikasi tercerahkan di sini: Perlindungan Informasi Windows (WIP).
Anda dapat menemukan sampel lengkap di sini.
Jika Anda siap untuk melalui setiap tugas, mari kita mulai.
Pertama, kumpulkan apa yang Anda butuhkan
Anda akan membutuhkan ini:
Komputer Virtual (VM) pengujian yang menjalankan Windows 10, versi 1607 atau yang lebih baru. Anda akan men-debug aplikasi terhadap VM pengujian ini.
Komputer pengembangan yang menjalankan Windows 10, versi 1607 atau yang lebih baru. Ini bisa menjadi VM pengujian Anda jika Anda telah menginstal Visual Studio di atasnya.
Menyiapkan lingkungan pengembangan Anda
Anda akan melakukan hal-hal ini:
Instal Asisten Pengembang Penyiapan WIP ke VM pengujian Anda
Membuat kebijakan perlindungan dengan menggunakan Asisten Pengembang Penyiapan WIP
Instal Asisten Pengembang Penyiapan WIP ke VM pengujian Anda
Gunakan alat ini untuk menyiapkan kebijakan Perlindungan Informasi Windows pada VM pengujian Anda.
Unduh alat di sini: Asisten Pengembang Penyiapan WIP.
Membuat kebijakan perlindungan
Tentukan kebijakan Anda dengan menambahkan informasi ke setiap bagian di asisten pengembang penyiapan WIP. Pilih ikon bantuan di samping pengaturan apa pun untuk mempelajari selengkapnya tentang cara menggunakannya.
Untuk panduan umum selengkapnya tentang cara menggunakan alat ini, lihat bagian Catatan versi di halaman unduhan aplikasi.
Menyiapkan proyek Visual Studio
Di komputer pengembangan Anda, buka proyek Anda.
Tambahkan referensi ke ekstensi desktop dan seluler untuk Platform Windows Universal (UWP).
Tambahkan kemampuan ini ke file manifes paket Anda:
<rescap:Capability Name="enterpriseDataPolicy"/>
Pembacaan Opsional: Awalan "reskap" berarti Kemampuan Terbatas. Lihat Kemampuan khusus dan terbatas.
Tambahkan namespace layanan ini ke file manifes paket Anda:
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
Tambahkan awalan namespace layanan ke
<ignorableNamespaces>
elemen file manifes paket Anda.<IgnorableNamespaces="uap mp rescap">
Dengan cara ini, jika aplikasi Anda berjalan pada versi sistem operasi Windows yang tidak mendukung kemampuan terbatas, Windows akan mengabaikan kemampuan tersebut
enterpriseDataPolicy
.
Menyiapkan penelusuran kesalahan jarak jauh
Instal Alat Jarak Jauh Visual Studio pada VM pengujian hanya jika Anda mengembangkan aplikasi di komputer selain VM Anda. Kemudian, pada komputer pengembangan Anda, mulai debugger jarak jauh dan lihat apakah aplikasi Anda berjalan pada VM pengujian.
Lihat Instruksi PC jarak jauh.
Tambahkan namespace ini ke file kode Anda
Tambahkan ini menggunakan pernyataan ke bagian atas file kode Anda (Cuplikan dalam panduan ini menggunakannya):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.Security.EnterpriseData;
using Windows.Web.Http;
using Windows.Storage.Streams;
using Windows.ApplicationModel.DataTransfer;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml;
using Windows.ApplicationModel.Activation;
using Windows.Web.Http.Filters;
using Windows.Storage;
using Windows.Data.Xml.Dom;
using Windows.Foundation.Metadata;
using Windows.Web.Http.Headers;
Menentukan apakah akan menggunakan API WIP di aplikasi Anda
Pastikan bahwa sistem operasi yang menjalankan aplikasi Anda mendukung WIP dan WIP diaktifkan pada perangkat.
bool use_WIP_APIs = false;
if ((ApiInformation.IsApiContractPresent
("Windows.Security.EnterpriseData.EnterpriseDataContract", 3)
&& ProtectionPolicyManager.IsProtectionEnabled))
{
use_WIP_APIs = true;
}
else
{
use_WIP_APIs = false;
}
Jangan panggil API WIP jika sistem operasi tidak mendukung WIP atau WIP tidak diaktifkan pada perangkat.
Membaca data perusahaan
Untuk membaca file yang dilindungi, titik akhir jaringan, data clipboard, dan data yang Anda terima dari kontrak Berbagi, aplikasi Anda harus meminta akses.
Perlindungan Informasi Windows memberi aplikasi Anda izin jika aplikasi Anda ada di daftar kebijakan perlindungan yang diizinkan.
Di bagian ini:
- Membaca data dari file
- Membaca data dari titik akhir jaringan
- Membaca data dari clipboard
- Membaca data dari kontrak Berbagi
Membaca data dari file
Langkah 1: Dapatkan handel file
Windows.Storage.StorageFolder storageFolder =
Windows.Storage.ApplicationData.Current.LocalFolder;
Windows.Storage.StorageFile file =
await storageFolder.GetFileAsync(fileName);
Langkah 2: Tentukan apakah aplikasi Anda dapat membuka file
Panggil FileProtectionManager.GetProtectionInfoAsync untuk menentukan apakah aplikasi Anda dapat membuka file.
FileProtectionInfo protectionInfo = await FileProtectionManager.GetProtectionInfoAsync(file);
if ((protectionInfo.Status != FileProtectionStatus.Protected &&
protectionInfo.Status != FileProtectionStatus.Unprotected))
{
return false;
}
else if (protectionInfo.Status == FileProtectionStatus.Revoked)
{
// Code goes here to handle this situation. Perhaps, show UI
// saying that the user's data has been revoked.
}
Nilai FileProtectionStatus dari Protected berarti file dilindungi dan aplikasi Anda dapat membukanya karena aplikasi Anda ada di daftar kebijakan yang diizinkan.
Nilai FileProtectionStatus dari UnProtected berarti file tidak dilindungi dan aplikasi Anda dapat membuka file bahkan aplikasi Anda tidak ada dalam daftar kebijakan yang diizinkan.
Api
FileProtectionManager.GetProtectionInfoAsync
FileProtectionInfo
FileProtectionStatus
ProtectionPolicyManager.IsIdentityManaged
Langkah 3: Membaca file ke dalam aliran atau buffer
Membaca file ke dalam aliran
var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite);
Membaca file ke dalam buffer
var buffer = await Windows.Storage.FileIO.ReadBufferAsync(file);
Membaca data dari titik akhir jaringan
Buat konteks utas yang dilindungi untuk dibaca dari titik akhir perusahaan.
Langkah 1: Dapatkan identitas titik akhir jaringan
Uri resourceURI = new Uri("http://contoso.com/stockData.xml");
Windows.Networking.HostName hostName =
new Windows.Networking.HostName(resourceURI.Host);
string identity = await ProtectionPolicyManager.
GetPrimaryManagedIdentityForNetworkEndpointAsync(hostName);
Jika titik akhir tidak dikelola oleh kebijakan, Anda akan mendapatkan kembali string kosong.
Api
ProtectionPolicyManager.GetPrimaryManagedIdentityForNetworkEndpointAsync
Langkah 2: Membuat konteks utas yang dilindungi
Jika titik akhir dikelola oleh kebijakan, buat konteks utas yang dilindungi. Ini menandai koneksi jaringan apa pun yang Anda buat pada utas yang sama ke identitas.
Ini juga memberi Anda akses ke sumber daya jaringan perusahaan yang dikelola oleh kebijakan tersebut.
if (!string.IsNullOrEmpty(identity))
{
using (ThreadNetworkContext threadNetworkContext =
ProtectionPolicyManager.CreateCurrentThreadNetworkContext(identity))
{
return await GetDataFromNetworkRedirectHelperMethod(resourceURI);
}
}
else
{
return await GetDataFromNetworkRedirectHelperMethod(resourceURI);
}
Contoh ini mengapit panggilan soket dalam using
blok. Jika Anda tidak melakukan ini, pastikan Anda menutup konteks utas setelah mengambil sumber daya. Lihat ThreadNetworkContext.Close.
Jangan membuat file pribadi apa pun pada utas yang dilindungi tersebut karena file tersebut akan dienkripsi secara otomatis.
Metode ProtectionPolicyManager.CreateCurrentThreadNetworkContext mengembalikan objek ThreadNetworkContext apakah titik akhir dikelola oleh kebijakan atau tidak. Jika aplikasi Anda menangani sumber daya pribadi dan perusahaan, panggil ProtectionPolicyManager.CreateCurrentThreadNetworkContext untuk semua identitas. Setelah Anda mendapatkan sumber daya, buang ThreadNetworkContext untuk menghapus tag identitas apa pun dari utas saat ini.
Api
ProtectionPolicyManager.GetForCurrentView
ProtectionPolicyManager.Identity
ProtectionPolicyManager.CreateCurrentThreadNetworkContext
Langkah 3: Membaca sumber daya ke dalam buffer
private static async Task<IBuffer> GetDataFromNetworkHelperMethod(Uri resourceURI)
{
HttpClient client;
client = new HttpClient();
try { return await client.GetBufferAsync(resourceURI); }
catch (Exception) { return null; }
}
(Opsional) Menggunakan token header alih-alih membuat konteks utas yang dilindungi
public static async Task<IBuffer> GetDataFromNetworkbyUsingHeader(Uri resourceURI)
{
HttpClient client;
Windows.Networking.HostName hostName =
new Windows.Networking.HostName(resourceURI.Host);
string identity = await ProtectionPolicyManager.
GetPrimaryManagedIdentityForNetworkEndpointAsync(hostName);
if (!string.IsNullOrEmpty(identity))
{
client = new HttpClient();
HttpRequestHeaderCollection headerCollection = client.DefaultRequestHeaders;
headerCollection.Add("X-MS-Windows-HttpClient-EnterpriseId", identity);
return await GetDataFromNetworkbyUsingHeaderHelperMethod(client, resourceURI);
}
else
{
client = new HttpClient();
return await GetDataFromNetworkbyUsingHeaderHelperMethod(client, resourceURI);
}
}
private static async Task<IBuffer> GetDataFromNetworkbyUsingHeaderHelperMethod(HttpClient client, Uri resourceURI)
{
try { return await client.GetBufferAsync(resourceURI); }
catch (Exception) { return null; }
}
Menangani pengalihan halaman
Terkadang server web akan mengalihkan lalu lintas ke versi sumber daya yang lebih baru.
Untuk menangani ini, buat permintaan hingga status respons permintaan Anda memiliki nilai OK.
Kemudian gunakan URI respons tersebut untuk mendapatkan identitas titik akhir. Berikut adalah salah satu cara untuk melakukan ini:
private static async Task<IBuffer> GetDataFromNetworkRedirectHelperMethod(Uri resourceURI)
{
HttpClient client = null;
HttpBaseProtocolFilter filter = new HttpBaseProtocolFilter();
filter.AllowAutoRedirect = false;
client = new HttpClient(filter);
HttpResponseMessage response = null;
HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Get, resourceURI);
response = await client.SendRequestAsync(message);
if (response.StatusCode == HttpStatusCode.MultipleChoices ||
response.StatusCode == HttpStatusCode.MovedPermanently ||
response.StatusCode == HttpStatusCode.Found ||
response.StatusCode == HttpStatusCode.SeeOther ||
response.StatusCode == HttpStatusCode.NotModified ||
response.StatusCode == HttpStatusCode.UseProxy ||
response.StatusCode == HttpStatusCode.TemporaryRedirect ||
response.StatusCode == HttpStatusCode.PermanentRedirect)
{
message = new HttpRequestMessage(HttpMethod.Get, message.RequestUri);
response = await client.SendRequestAsync(message);
try { return await response.Content.ReadAsBufferAsync(); }
catch (Exception) { return null; }
}
else
{
try { return await response.Content.ReadAsBufferAsync(); }
catch (Exception) { return null; }
}
}
Api
ProtectionPolicyManager.GetPrimaryManagedIdentityForNetworkEndpointAsync
ProtectionPolicyManager.CreateCurrentThreadNetworkContext
ProtectionPolicyManager.GetForCurrentView
ProtectionPolicyManager.Identity
Membaca data dari clipboard
Mendapatkan izin untuk menggunakan data dari clipboard
Untuk mendapatkan data dari clipboard, mintalah izin kepada Windows. Gunakan DataPackageView.RequestAccessAsync untuk melakukannya.
public static async Task PasteText(TextBox textBox)
{
DataPackageView dataPackageView = Clipboard.GetContent();
if (dataPackageView.Contains(StandardDataFormats.Text))
{
ProtectionPolicyEvaluationResult result = await dataPackageView.RequestAccessAsync();
if (result == ProtectionPolicyEvaluationResult..Allowed)
{
string contentsOfClipboard = await dataPackageView.GetTextAsync();
textBox.Text = contentsOfClipboard;
}
}
}
Menyembunyikan atau menonaktifkan fitur yang menggunakan data clipboard
Tentukan apakah tampilan saat ini memiliki izin untuk mendapatkan data yang ada di clipboard.
Jika tidak, Anda dapat menonaktifkan atau menyembunyikan kontrol yang memungkinkan pengguna menempelkan informasi dari clipboard atau mempratinjau kontennya.
private bool IsClipboardAllowedAsync()
{
ProtectionPolicyEvaluationResult protectionPolicyEvaluationResult = ProtectionPolicyEvaluationResult.Blocked;
DataPackageView dataPackageView = Clipboard.GetContent();
if (dataPackageView.Contains(StandardDataFormats.Text))
protectionPolicyEvaluationResult =
ProtectionPolicyManager.CheckAccess(dataPackageView.Properties.EnterpriseId,
ProtectionPolicyManager.GetForCurrentView().Identity);
return (protectionPolicyEvaluationResult == ProtectionPolicyEvaluationResult.Allowed |
protectionPolicyEvaluationResult == ProtectionPolicyEvaluationResult.ConsentRequired);
}
Api
ProtectionPolicyEvaluationResult
ProtectionPolicyManager.GetForCurrentView
ProtectionPolicyManager.Identity
Mencegah pengguna diminta dengan kotak dialog persetujuan
Dokumen baru bukan pribadi atau perusahaan. Ini baru. Jika pengguna menempelkan data perusahaan ke dalamnya, Windows memberlakukan kebijakan dan pengguna diminta dengan dialog persetujuan. Kode ini mencegah hal itu terjadi. Tugas ini bukan tentang membantu melindungi data. Ini lebih tentang menjaga pengguna dari menerima kotak dialog persetujuan jika aplikasi Anda membuat item baru.
private async void PasteText(bool isNewEmptyDocument)
{
DataPackageView dataPackageView = Clipboard.GetContent();
if (dataPackageView.Contains(StandardDataFormats.Text))
{
if (!string.IsNullOrEmpty(dataPackageView.Properties.EnterpriseId))
{
if (isNewEmptyDocument)
{
ProtectionPolicyManager.TryApplyProcessUIPolicy(dataPackageView.Properties.EnterpriseId);
string contentsOfClipboard = contentsOfClipboard = await dataPackageView.GetTextAsync();
// add this string to the new item or document here.
}
else
{
ProtectionPolicyEvaluationResult result = await dataPackageView.RequestAccessAsync();
if (result == ProtectionPolicyEvaluationResult.Allowed)
{
string contentsOfClipboard = contentsOfClipboard = await dataPackageView.GetTextAsync();
// add this string to the new item or document here.
}
}
}
}
}
Api
DataPackageView.RequestAccessAsync
ProtectionPolicyEvaluationResult
ProtectionPolicyManager.TryApplyProcessUIPolicy
Membaca data dari kontrak Berbagi
Saat karyawan memilih aplikasi Anda untuk membagikan informasinya, aplikasi Anda akan membuka item baru yang berisi konten tersebut.
Seperti yang kami sebutkan sebelumnya, item baru bukan pribadi atau perusahaan. Ini baru. Jika kode Anda menambahkan konten perusahaan ke item, Windows memberlakukan kebijakan dan pengguna diminta dengan dialog persetujuan. Kode ini mencegah hal itu terjadi.
protected override async void OnShareTargetActivated(ShareTargetActivatedEventArgs args)
{
bool isNewEmptyDocument = true;
string identity = "corp.microsoft.com";
ShareOperation shareOperation = args.ShareOperation;
if (shareOperation.Data.Contains(StandardDataFormats.Text))
{
if (!string.IsNullOrEmpty(shareOperation.Data.Properties.EnterpriseId))
{
if (isNewEmptyDocument)
// If this is a new and empty document, and we're allowed to access
// the data, then we can avoid popping the consent dialog
ProtectionPolicyManager.TryApplyProcessUIPolicy(shareOperation.Data.Properties.EnterpriseId);
else
{
// In this case, we can't optimize the workflow, so we just
// request consent from the user in this case.
ProtectionPolicyEvaluationResult protectionPolicyEvaluationResult = await shareOperation.Data.RequestAccessAsync();
if (protectionPolicyEvaluationResult == ProtectionPolicyEvaluationResult.Allowed)
{
string text = await shareOperation.Data.GetTextAsync();
// Do something with that text.
}
}
}
else
{
// If the data has no enterprise identity, then we already have access.
string text = await shareOperation.Data.GetTextAsync();
// Do something with that text.
}
}
}
Api
ProtectionPolicyManager.RequestAccessAsync
ProtectionPolicyEvaluationResult
ProtectionPolicyManager.TryApplyProcessUIPolicy
Melindungi data perusahaan
Lindungi data perusahaan yang meninggalkan aplikasi Anda. Data meninggalkan aplikasi saat Anda menampilkannya di halaman, menyimpannya ke file atau titik akhir jaringan, atau melalui kontrak berbagi.
Di bagian ini:
- Lindungi data yang muncul di halaman
- Melindungi data ke file sebagai proses latar belakang
- Lindungi bagian dari file
- Membaca bagian file yang dilindungi
- Melindungi data ke folder
- Melindungi data ke titik akhir jaringan
- Melindungi data yang dibagikan aplikasi Anda melalui kontrak berbagi
- Lindungi file yang Anda salin ke lokasi lain
- Melindungi data perusahaan saat layar perangkat dikunci
Lindungi data yang muncul di halaman
Saat Anda menampilkan data dalam halaman, beri tahu Windows jenis data apa itu (pribadi atau perusahaan). Untuk melakukannya, tandai tampilan aplikasi saat ini atau tandai seluruh proses aplikasi.
Ketika Anda menandai tampilan atau proses, Windows memberlakukan kebijakan di dalamnya. Ini membantu mencegah kebocoran data yang dihasilkan dari tindakan yang tidak dikontrol aplikasi Anda. Misalnya, di komputer, pengguna dapat menggunakan CTRL-V untuk menyalin informasi perusahaan dari tampilan lalu menempelkan informasi tersebut ke aplikasi lain. Windows melindungi dari itu. Windows juga membantu memberlakukan kontrak berbagi.
Menandai tampilan aplikasi saat ini
Lakukan ini jika aplikasi Anda memiliki beberapa tampilan di mana beberapa tampilan menggunakan data perusahaan dan beberapa menggunakan data pribadi.
// tag as enterprise data. "identity" the string that contains the enterprise ID.
// You'd get that from a file, network endpoint, or clipboard data package.
ProtectionPolicyManager.GetForCurrentView().Identity = identity;
// tag as personal data.
ProtectionPolicyManager.GetForCurrentView().Identity = String.Empty;
Api
ProtectionPolicyManager.GetForCurrentView
ProtectionPolicyManager.Identity
Menandai proses
Lakukan ini jika semua tampilan di aplikasi Anda hanya akan berfungsi dengan satu jenis data (pribadi atau perusahaan).
Ini mencegah Anda harus mengelola tampilan yang ditandai secara independen.
// tag as enterprise data. "identity" the string that contains the enterprise ID.
// You'd get that from a file, network endpoint, or clipboard data package.
bool result =
ProtectionPolicyManager.TryApplyProcessUIPolicy(identity);
// tag as personal data.
ProtectionPolicyManager.ClearProcessUIPolicy();
Melindungi data ke file
Buat file yang dilindungi lalu tulis ke file tersebut.
Langkah 1: Tentukan apakah aplikasi Anda dapat membuat file perusahaan
Aplikasi Anda dapat membuat file perusahaan jika string identitas dikelola oleh kebijakan dan aplikasi Anda ada di daftar Kebijakan yang diizinkan.
if (!ProtectionPolicyManager.IsIdentityManaged(identity)) return false;
Langkah 2: Buat file dan lindungi ke identitas
StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
StorageFile storageFile = await storageFolder.CreateFileAsync("sample.txt",
CreationCollisionOption.ReplaceExisting);
FileProtectionInfo fileProtectionInfo =
await FileProtectionManager.ProtectAsync(storageFile, identity);
Langkah 3: Tulis aliran atau buffer tersebut ke file
Menulis aliran
if (fileProtectionInfo.Status == FileProtectionStatus.Protected)
{
var stream = await storageFile.OpenAsync(FileAccessMode.ReadWrite);
using (var outputStream = stream.GetOutputStreamAt(0))
{
using (var dataWriter = new DataWriter(outputStream))
{
dataWriter.WriteString(enterpriseData);
}
}
}
Menulis buffer
if (fileProtectionInfo.Status == FileProtectionStatus.Protected)
{
var buffer = Windows.Security.Cryptography.CryptographicBuffer.ConvertStringToBinary(
enterpriseData, Windows.Security.Cryptography.BinaryStringEncoding.Utf8);
await FileIO.WriteBufferAsync(storageFile, buffer);
}
Melindungi data ke file sebagai proses latar belakang
Kode ini dapat berjalan saat layar perangkat dikunci. Jika administrator mengonfigurasi kebijakan "Perlindungan data di bawah kunci" (DPL) yang aman, Windows akan menghapus kunci enkripsi yang diperlukan untuk mengakses sumber daya yang dilindungi dari memori perangkat. Ini mencegah kebocoran data jika perangkat hilang. Fitur yang sama ini juga menghapus kunci yang terkait dengan file yang dilindungi saat handelnya ditutup.
Anda harus menggunakan pendekatan yang membuat handel file tetap terbuka saat membuat file.
Langkah 1: Tentukan apakah Anda dapat membuat file perusahaan
Anda dapat membuat file perusahaan jika identitas yang Anda gunakan dikelola oleh kebijakan dan aplikasi Anda ada dalam daftar kebijakan yang diizinkan.
if (!ProtectionPolicyManager.IsIdentityManaged(identity)) return false;
Langkah 2: Buat file dan lindungi ke identitas
FileProtectionManager.CreateProtectedAndOpenAsync membuat file yang dilindungi dan menjaga handel file tetap terbuka saat Anda menulisnya.
StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
ProtectedFileCreateResult protectedFileCreateResult =
await FileProtectionManager.CreateProtectedAndOpenAsync(storageFolder,
"sample.txt", identity, CreationCollisionOption.ReplaceExisting);
Langkah 3: Menulis aliran atau buffer ke file
Contoh ini menulis aliran ke file.
if (protectedFileCreateResult.ProtectionInfo.Status == FileProtectionStatus.Protected)
{
IOutputStream outputStream =
protectedFileCreateResult.Stream.GetOutputStreamAt(0);
using (DataWriter writer = new DataWriter(outputStream))
{
writer.WriteString(enterpriseData);
await writer.StoreAsync();
await writer.FlushAsync();
}
outputStream.Dispose();
}
else if (protectedFileCreateResult.ProtectionInfo.Status == FileProtectionStatus.AccessSuspended)
{
// Perform any special processing for the access suspended case.
}
Api
ProtectedFileCreateResult.ProtectionInfo
FileProtectionStatus
ProtectedFileCreateResult.Stream
Lindungi bagian dari file
Dalam kebanyakan kasus, lebih bersih untuk menyimpan data perusahaan dan pribadi secara terpisah tetapi Anda dapat menyimpannya ke file yang sama jika Anda mau. Misalnya, Microsoft Outlook dapat menyimpan email perusahaan bersama email pribadi dalam satu file arsip.
Enkripsi data perusahaan tetapi bukan seluruh file. Dengan begitu, pengguna dapat terus menggunakan file tersebut meskipun mereka membatalkan pendaftaran dari MDM atau hak akses data perusahaan mereka dicabut. Selain itu, aplikasi Anda harus melacak data apa yang dienkripsinya sehingga tahu data apa yang harus dilindungi saat membaca file kembali ke memori.
Langkah 1: Menambahkan data perusahaan ke aliran atau buffer terenkripsi
string enterpriseDataString = "<employees><employee><name>Bill</name><social>xxx-xxx-xxxx</social></employee></employees>";
var enterpriseData= Windows.Security.Cryptography.CryptographicBuffer.ConvertStringToBinary(
enterpriseDataString, Windows.Security.Cryptography.BinaryStringEncoding.Utf8);
BufferProtectUnprotectResult result =
await DataProtectionManager.ProtectAsync(enterpriseData, identity);
enterpriseData= result.Buffer;
Api
DataProtectionManager.ProtectAsync
BufferProtectUnprotectResult.buffer
Langkah 2: Menambahkan data pribadi ke aliran atau buffer yang tidak terenkripsi
string personalDataString = "<recipies><recipe><name>BillsCupCakes</name><cooktime>30</cooktime></recipe></recipies>";
var personalData = Windows.Security.Cryptography.CryptographicBuffer.ConvertStringToBinary(
personalDataString, Windows.Security.Cryptography.BinaryStringEncoding.Utf8);
Langkah 3: Tulis aliran atau buffer ke file
StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
StorageFile storageFile = await storageFolder.CreateFileAsync("data.xml",
CreationCollisionOption.ReplaceExisting);
// Write both buffers to the file and save the file.
var stream = await storageFile.OpenAsync(FileAccessMode.ReadWrite);
using (var outputStream = stream.GetOutputStreamAt(0))
{
using (var dataWriter = new DataWriter(outputStream))
{
dataWriter.WriteBuffer(enterpriseData);
dataWriter.WriteBuffer(personalData);
await dataWriter.StoreAsync();
await outputStream.FlushAsync();
}
}
Langkah 4: Melacak lokasi data perusahaan Anda dalam file
Aplikasi Anda bertanggung jawab untuk melacak data dalam file yang dimiliki perusahaan.
Anda bisa menyimpan informasi tersebut dalam properti yang terkait dengan file, dalam database, atau di beberapa teks header dalam file.
Contoh ini, menyimpan informasi tersebut ke file XML terpisah.
StorageFile metaDataFile = await storageFolder.CreateFileAsync("metadata.xml",
CreationCollisionOption.ReplaceExisting);
await Windows.Storage.FileIO.WriteTextAsync
(metaDataFile, "<EnterpriseDataMarker start='0' end='" + enterpriseData.Length.ToString() +
"'></EnterpriseDataMarker>");
Membaca bagian file yang dilindungi
Berikut adalah cara Anda membaca data perusahaan dari file tersebut.
Langkah 1: Dapatkan posisi data perusahaan Anda dalam file
Windows.Storage.StorageFolder storageFolder =
Windows.Storage.ApplicationData.Current.LocalFolder;
Windows.Storage.StorageFile metaDataFile =
await storageFolder.GetFileAsync("metadata.xml");
string metaData = await Windows.Storage.FileIO.ReadTextAsync(metaDataFile);
XmlDocument doc = new XmlDocument();
doc.LoadXml(metaData);
uint startPosition =
Convert.ToUInt16((doc.FirstChild.Attributes.GetNamedItem("start")).InnerText);
uint endPosition =
Convert.ToUInt16((doc.FirstChild.Attributes.GetNamedItem("end")).InnerText);
Langkah 2: Buka file data dan pastikan file tersebut tidak dilindungi
Windows.Storage.StorageFile dataFile =
await storageFolder.GetFileAsync("data.xml");
FileProtectionInfo protectionInfo =
await FileProtectionManager.GetProtectionInfoAsync(dataFile);
if (protectionInfo.Status == FileProtectionStatus.Protected)
return false;
Api
FileProtectionManager.GetProtectionInfoAsync
FileProtectionInfo
FileProtectionStatus
Langkah 3: Membaca data perusahaan dari file
var stream = await dataFile.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite);
stream.Seek(startPosition);
Windows.Storage.Streams.Buffer tempBuffer = new Windows.Storage.Streams.Buffer(50000);
IBuffer enterpriseData = await stream.ReadAsync(tempBuffer, endPosition, InputStreamOptions.None);
Langkah 4: Dekripsi buffer yang berisi data perusahaan
DataProtectionInfo dataProtectionInfo =
await DataProtectionManager.GetProtectionInfoAsync(enterpriseData);
if (dataProtectionInfo.Status == DataProtectionStatus.Protected)
{
BufferProtectUnprotectResult result = await DataProtectionManager.UnprotectAsync(enterpriseData);
enterpriseData = result.Buffer;
}
else if (dataProtectionInfo.Status == DataProtectionStatus.Revoked)
{
// Code goes here to handle this situation. Perhaps, show UI
// saying that the user's data has been revoked.
}
Api
DataProtectionInfo
DataProtectionManager.GetProtectionInfoAsync
Melindungi data ke folder
Anda dapat membuat folder dan melindunginya. Dengan begitu item apa pun yang Anda tambahkan ke folder tersebut dilindungi secara otomatis.
private async Task<bool> CreateANewFolderAndProtectItAsync(string folderName, string identity)
{
if (!ProtectionPolicyManager.IsIdentityManaged(identity)) return false;
StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
StorageFolder newStorageFolder =
await storageFolder.CreateFolderAsync(folderName);
FileProtectionInfo fileProtectionInfo =
await FileProtectionManager.ProtectAsync(newStorageFolder, identity);
if (fileProtectionInfo.Status != FileProtectionStatus.Protected)
{
// Protection failed.
return false;
}
return true;
}
Pastikan folder kosong sebelum Anda melindunginya. Anda tidak dapat melindungi folder yang sudah berisi item.
Api
ProtectionPolicyManager.IsIdentityManaged
FileProtectionManager.ProtectAsync
FileProtectionInfo.Identity
FileProtectionInfo.Status
Melindungi data ke titik akhir jaringan
Buat konteks utas yang dilindungi untuk mengirim data tersebut ke titik akhir perusahaan.
Langkah 1: Dapatkan identitas titik akhir jaringan
Windows.Networking.HostName hostName =
new Windows.Networking.HostName(resourceURI.Host);
string identity = await ProtectionPolicyManager.
GetPrimaryManagedIdentityForNetworkEndpointAsync(hostName);
Api
ProtectionPolicyManager.GetPrimaryManagedIdentityForNetworkEndpointAsync
Langkah 2: Buat konteks utas yang dilindungi dan kirim data ke titik akhir jaringan
HttpClient client = null;
if (!string.IsNullOrEmpty(m_EnterpriseId))
{
ProtectionPolicyManager.GetForCurrentView().Identity = identity;
using (ThreadNetworkContext threadNetworkContext =
ProtectionPolicyManager.CreateCurrentThreadNetworkContext(identity))
{
client = new HttpClient();
HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Put, resourceURI);
message.Content = new HttpStreamContent(dataToWrite);
HttpResponseMessage response = await client.SendRequestAsync(message);
if (response.StatusCode == HttpStatusCode.Ok)
return true;
else
return false;
}
}
else
{
return false;
}
Api
ProtectionPolicyManager.GetForCurrentView
ProtectionPolicyManager.Identity
ProtectionPolicyManager.CreateCurrentThreadNetworkContext
Melindungi data yang dibagikan aplikasi Anda melalui kontrak berbagi
Jika Anda ingin pengguna berbagi konten dari aplikasi, Anda harus menerapkan kontrak berbagi dan menangani peristiwa DataTransferManager.DataRequested.
Di penanganan aktivitas Anda, atur konteks identitas perusahaan dalam paket data.
private void OnShareSourceOperation(object sender, RoutedEventArgs e)
{
// Register the current page as a share source (or you could do this earlier in your app).
DataTransferManager.GetForCurrentView().DataRequested += OnDataRequested;
DataTransferManager.ShowShareUI();
}
private void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
if (!string.IsNullOrEmpty(this.shareSourceContent))
{
var protectionPolicyManager = ProtectionPolicyManager.GetForCurrentView();
DataPackage requestData = args.Request.Data;
requestData.Properties.Title = this.shareSourceTitle;
requestData.Properties.EnterpriseId = protectionPolicyManager.Identity;
requestData.SetText(this.shareSourceContent);
}
}
Api
ProtectionPolicyManager.GetForCurrentView
ProtectionPolicyManager.Identity
Lindungi file yang Anda salin ke lokasi lain
private async void CopyProtectionFromOneFileToAnother
(StorageFile sourceStorageFile, StorageFile targetStorageFile)
{
bool copyResult = await
FileProtectionManager.CopyProtectionAsync(sourceStorageFile, targetStorageFile);
if (!copyResult)
{
// Copying failed. To diagnose, you could check the file's status.
// (call FileProtectionManager.GetProtectionInfoAsync and
// check FileProtectionInfo.Status).
}
}
Melindungi data perusahaan saat layar perangkat dikunci
Hapus semua data sensitif dalam memori saat perangkat dikunci. Saat pengguna membuka kunci perangkat, aplikasi Anda dapat dengan aman menambahkan data tersebut kembali.
Tangani peristiwa ProtectionPolicyManager.ProtectedAccessSuspending sehingga aplikasi Anda tahu kapan layar dikunci. Kejadian ini dimunculkan hanya jika administrator mengonfigurasi perlindungan data aman di bawah kebijakan kunci. Windows untuk sementara menghapus kunci perlindungan data yang disediakan pada perangkat. Windows menghapus kunci ini untuk memastikan bahwa tidak ada akses tidak sah ke data terenkripsi saat perangkat terkunci dan mungkin tidak dimiliki pemiliknya.
Tangani peristiwa ProtectionPolicyManager.ProtectedAccessResumed sehingga aplikasi Anda tahu kapan layar tidak terkunci. Kejadian ini dimunculkan terlepas dari apakah administrator mengonfigurasi perlindungan data aman di bawah kebijakan penguncian.
Menghapus data sensitif dalam memori saat layar dikunci
Lindungi data sensitif, dan tutup aliran file apa pun yang telah dibuka aplikasi Anda pada file yang dilindungi untuk membantu memastikan bahwa sistem tidak menyimpan data sensitif apa pun dalam memori.
Contoh ini menyimpan konten dari blok teks ke buffer terenkripsi dan menghapus konten dari blok teks tersebut.
private async void ProtectionPolicyManager_ProtectedAccessSuspending(object sender, ProtectedAccessSuspendingEventArgs e)
{
Deferral deferral = e.GetDeferral();
if (ProtectionPolicyManager.GetForCurrentView().Identity != String.Empty)
{
IBuffer documentBodyBuffer = CryptographicBuffer.ConvertStringToBinary
(documentTextBlock.Text, BinaryStringEncoding.Utf8);
BufferProtectUnprotectResult result = await DataProtectionManager.ProtectAsync
(documentBodyBuffer, ProtectionPolicyManager.GetForCurrentView().Identity);
if (result.ProtectionInfo.Status == DataProtectionStatus.Protected)
{
this.protectedDocumentBuffer = result.Buffer;
documentTextBlock.Text = null;
}
}
// Close any open streams that you are actively working with
// to make sure that we have no unprotected content in memory.
// Optionally, code goes here to use e.Deadline to determine whether we have more
// than 15 seconds left before the suspension deadline. If we do then process any
// messages queued up for sending while we are still able to access them.
deferral.Complete();
}
Api
ProtectionPolicyManager.ProtectedAccessSuspending
ProtectionPolicyManager.GetForCurrentView
ProtectionPolicyManager.Identity
DataProtectionManager.ProtectAsync
BufferProtectUnprotectResult.buffer
ProtectedAccessSuspendingEventArgs.GetDeferral
Deferral.Complete
Menambahkan kembali data sensitif saat perangkat tidak terkunci
ProtectionPolicyManager.ProtectedAccessResumed dinaikkan ketika perangkat tidak terkunci dan kunci tersedia di perangkat lagi.
ProtectedAccessResumedEventArgs.Identities adalah koleksi kosong jika administrator belum mengonfigurasi perlindungan data yang aman di bawah kebijakan kunci.
Contoh ini melakukan kebalikan dari contoh sebelumnya. Ini mendekripsi buffer, menambahkan informasi dari buffer itu kembali ke kotak teks dan kemudian membuang buffer.
private async void ProtectionPolicyManager_ProtectedAccessResumed(object sender, ProtectedAccessResumedEventArgs e)
{
if (ProtectionPolicyManager.GetForCurrentView().Identity != String.Empty)
{
BufferProtectUnprotectResult result = await DataProtectionManager.UnprotectAsync
(this.protectedDocumentBuffer);
if (result.ProtectionInfo.Status == DataProtectionStatus.Unprotected)
{
// Restore the unprotected version.
documentTextBlock.Text = CryptographicBuffer.ConvertBinaryToString
(BinaryStringEncoding.Utf8, result.Buffer);
this.protectedDocumentBuffer = null;
}
}
}
Api
ProtectionPolicyManager.ProtectedAccessResumed
ProtectionPolicyManager.GetForCurrentView
ProtectionPolicyManager.Identity
DataProtectionManager.UnprotectAsync
BufferProtectUnprotectResult.Status
Menangani data perusahaan saat konten yang dilindungi dicabut
Jika Anda ingin aplikasi Anda diberi tahu saat perangkat tidak terdaftar dari MDM atau saat administrator kebijakan secara eksplisit mencabut akses ke data perusahaan, tangani peristiwa ProtectionPolicyManager_ProtectedContentRevoked .
Contoh ini menentukan apakah data di kotak surat perusahaan untuk aplikasi email telah dicabut.
private string mailIdentity = "contoso.com";
void MailAppSetup()
{
ProtectionPolicyManager.ProtectedContentRevoked += ProtectionPolicyManager_ProtectedContentRevoked;
// Code goes here to set up mailbox for 'mailIdentity'.
}
private void ProtectionPolicyManager_ProtectedContentRevoked(object sender, ProtectedContentRevokedEventArgs e)
{
if (!new System.Collections.Generic.List<string>(e.Identities).Contains
(this.mailIdentity))
{
// This event is not for our identity.
return;
}
// Code goes here to delete any metadata associated with 'mailIdentity'.
}