WPF Kısmi Güven Güvenliği
Genel olarak, kötü amaçlı hasar engellemek için Internet uygulamalarının kritik sistem kaynaklarına doğrudan erişimi olması kısıtlanmalıdır. Varsayılan olarak, HTML ve istemci tarafı komut dosyası dilleri kritik sistem kaynaklarına erişemez. Windows Presentation Foundation (WPF) tarayıcıda barındırılan uygulamalar tarayıcıdan başlatılabildiğinden, benzer bir kısıtlama kümesine uymalıdır. bu kısıtlamaları zorlamak için WPF hem kod erişim güvenliği (CAS) hem de ClickOnce kullanır (bkz. wpf güvenlik stratejisi-Platform güvenliği). Varsayılan olarak, tarayıcıda barındırılan uygulamalar Internet, yerel intranet veya yerel bilgisayar tarafından başlatıldıklarından bağımsız olarak Internet bölgesi CA 'ları izin kümesi ister. Tüm izin kümesinden daha az bir şekilde çalışan uygulamalar kısmi güvenle çalışıyor olarak kabul edilir.
WPF, olabildiğince fazla işlevselliğin kısmi güvende güvenli bir şekilde kullanılabileceği ve CA 'ların yanı sıra, kısmi güven programlama için ek destek sağlayan çok çeşitli destek sağlar.
Bu konu aşağıdaki bölümleri içermektedir:
WPF özelliği kısmi güven desteği
aşağıdaki tabloda, ınternet bölgesi izin kümesi sınırları içinde kullanılmak üzere güvenli olan Windows Presentation Foundation (WPF) üst düzey özellikleri listelenmektedir.
tablo 1: kısmi güvende Kasa WPF özellikleri
| Özellik alanı | Özellik |
|---|---|
| Genel | Tarayıcı penceresi Kaynak erişimi sitesi IsolatedStorage (512KB sınırı) UIAutomation sağlayıcıları Verme Giriş Yöntemi Düzenleyicileri (IME'ler) Tablet ekran kalemi ve mürekkep Fare yakalama ve taşıma olayları kullanılarak sanal sürükleyip bırakma OpenFileDialog XAML serisini kaldırma (XamlReader. Load aracılığıyla) |
| Web tümleştirmesi | Tarayıcı Indirme Iletişim kutusu Top-Level User-Initiated gezintisi mailto: bağlantılar Tekdüzen Kaynak tanımlayıcısı parametreleri HTTPWebRequest IFRAME 'de barındırılan WPF Içeriği Çerçeve kullanarak Same-Site HTML sayfaları barındırma WebBrowser kullanarak aynı site HTML sayfalarının barındırılması Web Hizmetleri (ASMX) Web hizmetleri (Windows Communication Foundation kullanarak) Betik Oluşturma Belge Nesne Modeli |
| Görseller | 2B ve 3B Animasyon Medya (kaynak ve etki alanları arası) Görüntü/ses/video |
| Okunanlar | FlowDocuments XPS belgeleri Katıştırılmış & sistem yazı tipleri CFF & TrueType yazı tipleri |
| Düzenleme | Yazım denetimi RichTextBox Düz metin ve mürekkep panosu desteği User-Initiated Yapıştır Seçili Içerik kopyalanıyor |
| Denetimler | Genel denetimler |
Bu tablo, WPF özelliklerini yüksek düzeyde ele alır. daha ayrıntılı bilgi için Windows SDK WPF içindeki her üye için gereken izinleri belgelemektedir. Ayrıca, aşağıdaki özellikler, kısmi güven yürütme ile ilgili özel konular da dahil olmak üzere daha ayrıntılı bilgiler sunar.
XAML (bkz. WPF Içinde xaml).
Açılır pencereler (bkz System.Windows.Controls.Primitives.Popup .).
Sürükleyip Bırakın (bkz. sürükleme ve bırakmaya genel bakış).
Pano (bkz System.Windows.Clipboard .).
Görüntüleme (bkz System.Windows.Controls.Image .).
Serileştirme (bkz XamlReader.LoadXamlWriter.Save .,).
Dosya Aç Iletişim kutusu (bkz Microsoft.Win32.OpenFileDialog .).
Aşağıdaki tabloda Internet bölgesi izin kümesi sınırları içinde çalıştırılması güvenli olmayan WPF özellikleri özetlenmektedir.
tablo 2: kısmi güvende Kasa olmayan WPF özellikleri
| Özellik alanı | Özellik |
|---|---|
| Genel | pencere (uygulama tanımlı Windows ve iletişim kutuları) SaveFileDialog Dosya Sistemi Kayıt defteri erişimi Sürükleme ve Bırakma XAML serileştirme (XamlWriter. Save aracılığıyla) UIAutomation Istemcileri Kaynak pencere erişimi (HwndHost) Tam konuşma desteği Windows Forms birlikte çalışabilirlik |
| Görseller | Bit Eşlem Efektleri Görüntü kodlama |
| Düzenleme | Zengin metin biçimi panosu Tam XAML desteği |
Kısmi güven programlama
XBAP uygulamaları için, varsayılan izin kümesini aşan kod, güvenlik bölgesine bağlı olarak farklı davranışa sahip olur. Bazı durumlarda, Kullanıcı yüklemeyi denediklerinde bir uyarı alır. Kullanıcı devam etmeyi seçebilir veya yüklemeyi iptal edebilir. Aşağıdaki tabloda her güvenlik bölgesi için uygulamanın davranışı ve uygulamanın tam güven alması için yapmanız gerekenler açıklanmaktadır.
| Güvenlik Bölgesi | Davranış | Tam güven alma |
|---|---|---|
| Yerel bilgisayar | Otomatik tam güven | Eylem gerekmiyor. |
| Intranet ve güvenilen siteler | Tam güven iste | Kullanıcının istemde kaynağı görmesi için XBAP 'yi bir sertifikayla imzalayın. |
| İnternet | "Güven verilmedi" ile başarısız olur | XBAP 'yi bir sertifikayla imzalayın. |
Not
önceki tabloda açıklanan davranış, ClickOnce güvenilen dağıtım modelini takip eden tam güven xbap 'ler içindir.
Genel olarak, izin verilen izinleri aşabilir kod büyük olasılıkla hem tek başına hem de tarayıcıda barındırılan uygulamalar arasında paylaşılan ortak koddur. CAS ve WPF, bu senaryonun yönetilmesi için çeşitli teknikler sunmaktadır.
CA 'ları kullanarak Izinleri algılama
Bazı durumlarda, kitaplık derlemelerindeki paylaşılan kodun hem tek başına uygulamalar hem de XBAP 'ler tarafından kullanılabilmesi mümkündür. Bu durumlarda kod, uygulamanın verilen izin kümesinden izin verdiğinden daha fazla izin gerektirebilecek işlevselliği yürütebilir. uygulamanız, Microsoft .NET Framework security kullanarak belirli bir izne sahip olup olmadığını algılayabilir. Özellikle, Demand istenen iznin örneğinde yöntemini çağırarak belirli bir izne sahip olup olmadığını test edebilir. Bu, bir dosyayı yerel diske kaydetme yeteneğine sahip olup olmadığını sorgulayan kodu içeren aşağıdaki örnekte gösterilmiştir:
using System.IO;
using System.IO.IsolatedStorage;
using System.Security;
using System.Security.Permissions;
using System.Windows;
namespace SDKSample
{
public class FileHandling
{
public void Save()
{
if (IsPermissionGranted(new FileIOPermission(FileIOPermissionAccess.Write, @"c:\newfile.txt")))
{
// Write to local disk
using (FileStream stream = File.Create(@"c:\newfile.txt"))
using (StreamWriter writer = new StreamWriter(stream))
{
writer.WriteLine("I can write to local disk.");
}
}
else
{
MessageBox.Show("I can't write to local disk.");
}
}
// Detect whether or not this application has the requested permission
bool IsPermissionGranted(CodeAccessPermission requestedPermission)
{
try
{
// Try and get this permission
requestedPermission.Demand();
return true;
}
catch
{
return false;
}
}
Imports System.IO
Imports System.IO.IsolatedStorage
Imports System.Security
Imports System.Security.Permissions
Imports System.Windows
Namespace SDKSample
Public Class FileHandling
Public Sub Save()
If IsPermissionGranted(New FileIOPermission(FileIOPermissionAccess.Write, "c:\newfile.txt")) Then
' Write to local disk
Using stream As FileStream = File.Create("c:\newfile.txt")
Using writer As New StreamWriter(stream)
writer.WriteLine("I can write to local disk.")
End Using
End Using
Else
MessageBox.Show("I can't write to local disk.")
End If
End Sub
' Detect whether or not this application has the requested permission
Private Function IsPermissionGranted(ByVal requestedPermission As CodeAccessPermission) As Boolean
Try
' Try and get this permission
requestedPermission.Demand()
Return True
Catch
Return False
End Try
End Function
}
}
End Class
End Namespace
Bir uygulamada istenen izin yoksa, çağrısı Demand bir güvenlik özel durumu oluşturur. Aksi takdirde, izin verildi. IsPermissionGranted Bu davranışı kapsüller ve truefalse uygun şekilde döndürür.
Işlevsellikten oluşan düzgün düşme
Kodun, farklı bölgelerde yürütülebilecek kod için ne yapılması gerektiğini belirlemek için gereken izne sahip olup olmadığını tespit edebilirsiniz. Bölgenin bir şeyi algılarken, mümkünse Kullanıcı için bir alternatif sağlamak daha iyi bir seçenektir. Örneğin, bir tam güven uygulaması genellikle kullanıcıların istedikleri yerde dosya oluşturmasını sağlar, ancak kısmi bir güven uygulaması yalnızca yalıtılmış depolamada dosya oluşturabilir. Hem tam güven (tek başına) uygulamalar hem de kısmi güven (tarayıcı tarafından barındırılan) uygulamaları tarafından paylaşılan bir derlemede bir dosya oluşturmak için kod varsa ve her iki uygulama da kullanıcıların dosya oluşturabilmesini istiyorsanız, paylaşılan kod uygun konumda bir dosya oluşturmadan önce kısmi veya tam güvende çalışıp çalışmadığını tespit etmelidir. Aşağıdaki kod her ikisini de göstermektedir.
using System.IO;
using System.IO.IsolatedStorage;
using System.Security;
using System.Security.Permissions;
using System.Windows;
namespace SDKSample
{
public class FileHandlingGraceful
{
public void Save()
{
if (IsPermissionGranted(new FileIOPermission(FileIOPermissionAccess.Write, @"c:\newfile.txt")))
{
// Write to local disk
using (FileStream stream = File.Create(@"c:\newfile.txt"))
using (StreamWriter writer = new StreamWriter(stream))
{
writer.WriteLine("I can write to local disk.");
}
}
else
{
// Persist application-scope property to
// isolated storage
IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();
using (IsolatedStorageFileStream stream =
new IsolatedStorageFileStream("newfile.txt", FileMode.Create, storage))
using (StreamWriter writer = new StreamWriter(stream))
{
writer.WriteLine("I can write to Isolated Storage");
}
}
}
// Detect whether or not this application has the requested permission
bool IsPermissionGranted(CodeAccessPermission requestedPermission)
{
try
{
// Try and get this permission
requestedPermission.Demand();
return true;
}
catch
{
return false;
}
}
Imports System.IO
Imports System.IO.IsolatedStorage
Imports System.Security
Imports System.Security.Permissions
Imports System.Windows
Namespace SDKSample
Public Class FileHandlingGraceful
Public Sub Save()
If IsPermissionGranted(New FileIOPermission(FileIOPermissionAccess.Write, "c:\newfile.txt")) Then
' Write to local disk
Using stream As FileStream = File.Create("c:\newfile.txt")
Using writer As New StreamWriter(stream)
writer.WriteLine("I can write to local disk.")
End Using
End Using
Else
' Persist application-scope property to
' isolated storage
Dim storage As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication()
Using stream As New IsolatedStorageFileStream("newfile.txt", FileMode.Create, storage)
Using writer As New StreamWriter(stream)
writer.WriteLine("I can write to Isolated Storage")
End Using
End Using
End If
End Sub
' Detect whether or not this application has the requested permission
Private Function IsPermissionGranted(ByVal requestedPermission As CodeAccessPermission) As Boolean
Try
' Try and get this permission
requestedPermission.Demand()
Return True
Catch
Return False
End Try
End Function
}
}
End Class
End Namespace
Çoğu durumda, kısmi bir güvenin alternatif olarak bulunması gerekir.
İntranet gibi denetlenen bir ortamda, özel yönetilen çerçeveler, genel derleme önbelleği 'ne (GAC) istemci tabanı üzerinden yüklenebilir. Bu kitaplıklar, tam güven gerektiren ve yalnızca kullanarak kısmi güvenle izin verilen uygulamalardan başvurulabilen kodu yürütebilir AllowPartiallyTrustedCallersAttribute (daha fazla bilgi için bkz. AllowPartiallyTrustedCallersAttribute ve WPF Güvenlik Stratejisi-Platform güvenliği).
Tarayıcı ana bilgisayar algılama
İzinleri denetlemek için CAS kullanılması, izin temelinde denetim yapmanız gerektiğinde uygun bir tekniktir. Bu teknik, genel olarak önerilmeyen ve performans sorunlarına sahip olabilen normal işlemenin bir parçası olarak özel durumları yakalama konusuna bağımlıdır. Bunun yerine, XAML tarayıcı uygulamanız (XBAP) yalnızca Internet bölgesi korumalı alanında çalışıyorsa, BrowserInteropHelper.IsBrowserHosted XAML tarayıcı uygulamaları (XBAP) için doğru döndüren özelliğini kullanabilirsiniz.
Not
IsBrowserHosted yalnızca bir uygulamanın bir tarayıcıda çalışıp çalışmadığını ayırt eder, bu, bir uygulamanın hangi izin kümesiyle çalıştığını belirtir.
Izinleri yönetme
Varsayılan olarak, XBAP kısmi güvenle çalışır (varsayılan Internet bölgesi izin kümesi). Ancak, uygulamanın gereksinimlerine bağlı olarak, varsayılan olarak izin kümesini değiştirmek mümkündür. Örneğin, bir XBAP yerel intranetten başlatılmışsa, aşağıdaki tabloda gösterilen daha yüksek bir izin kümesinden yararlanabilir.
Tablo 3: LocalIntranet ve Internet Izinleri
| İzin | Öznitelik | Yerel Intranet | İnternet |
|---|---|---|---|
| DNS | DNS sunucularına erişme | Yes | Hayır |
| Ortam Değişkenleri | Okuma | Yes | Hayır |
| Dosya Iletişimleri | Aç | Yes | Yes |
| Dosya Iletişimleri | Sınırsız | Yes | Hayır |
| Yalıtılmış Depolama | Kullanıcıya göre derleme yalıtımı | Yes | Hayır |
| Yalıtılmış Depolama | Bilinmeyen yalıtım | Yes | Yes |
| Yalıtılmış Depolama | Sınırsız Kullanıcı kotası | Yes | Hayır |
| Medya | ses, video ve görüntü Kasa | Yes | Yes |
| Yazdırma | Varsayılan yazdırma | Yes | Hayır |
| Yazdırma | Kasa yazdırma | Yes | Yes |
| Yansıma | Pdb | Yes | Hayır |
| Güvenlik | Yönetilen kod yürütme | Yes | Yes |
| Güvenlik | İzin verilen izinler | Yes | Hayır |
| Kullanıcı Arabirimi | Sınırsız | Yes | Hayır |
| Kullanıcı Arabirimi | Kasa üst düzey pencereler | Yes | Yes |
| Kullanıcı Arabirimi | Kendi Pano | Yes | Yes |
| Web Tarayıcısı | Kasa HTML'ye çerçeve gezintisi | Yes | Yes |
Not
Kes ve Yapıştır yalnızca kullanıcı başlattığında kısmi güven içinde izin verilir.
İzinleri artırmaya ihtiyacınız varsa proje ayarlarını ve uygulama bildirimini ClickOnce gerekir. Daha fazla bilgi için bkz. WPF XAML Tarayıcı Uygulamalarına Genel Bakış. Aşağıdaki belgeler de yararlı olabilir.
XBAP'niz tam güven gerektiriyorsa, istenen izinleri artırmak için aynı araçları kullanabilirsiniz. Bir XBAP yalnızca yerel bilgisayarda, intranette veya tarayıcının güvenilen veya izin verilen sitelerinde listelenen bir URL'den yüklenir ve bu bilgisayardan açılırsa tam güven alır. Uygulama intranetten veya güvenilen bir siteden yüklenirse, kullanıcı yükseltilmiş izinler hakkında ClickOnce için standart uyarıyı alır. Kullanıcı devam edebilir veya yükleme işlemini iptal edebilir.
Alternatif olarak, herhangi bir güvenlik ClickOnce tam güven dağıtımı için güvenli dağıtım modelini kullanabilirsiniz. Daha fazla bilgi için bkz. Güvenilen Uygulama Dağıtımına Genel Bakış ve Güvenlik.