Veiligere bestands- en gegevenstoegang in Windows Forms
In .NET Framework worden machtigingen gebruikt om resources en gegevens te beveiligen. Waar uw toepassing gegevens kan lezen of schrijven, is afhankelijk van de machtigingen die aan de toepassing zijn verleend. Wanneer uw toepassing wordt uitgevoerd in een gedeeltelijke vertrouwensomgeving, hebt u mogelijk geen toegang tot uw gegevens of moet u mogelijk de manier wijzigen waarop u toegang hebt tot de gegevens.
Wanneer u een beveiligingsbeperking tegenkomt, hebt u twee opties: de machtiging bevestigen (ervan uitgaande dat deze is verleend aan uw toepassing) of een versie van de functie gebruiken die is geschreven om gedeeltelijk te vertrouwen. In de volgende secties wordt beschreven hoe u werkt met bestands-, database- en registertoegang vanuit toepassingen die worden uitgevoerd in een gedeeltelijke vertrouwensomgeving.
Notitie
Standaard stellen hulpprogramma's die ClickOnce-implementaties genereren, deze implementaties in om volledig vertrouwen te vragen van de computers waarop ze worden uitgevoerd. Als u besluit dat u de extra beveiligingsvoordelen van het uitvoeren in gedeeltelijke vertrouwensrelatie wilt, moet u deze standaardinstelling wijzigen in Visual Studio of een van de Windows SDK-hulpprogramma's (Mage.exe of MageUI.exe). Zie Beveiliging in Windows Forms Overviewvoor meer informatie over beveiliging van Windows Forms en over het bepalen van het juiste vertrouwensniveau voor uw toepassing.
Bestandstoegang
De FileIOPermission klasse beheert bestands- en maptoegang in .NET Framework. Standaard verleent het beveiligingssysteem de FileIOPermission niet aan gedeeltelijke vertrouwensomgevingen, zoals het lokale intranet en internetzones. Een toepassing waarvoor bestandstoegang is vereist, kan echter nog steeds werken in deze omgevingen als u het ontwerp van uw toepassing wijzigt of verschillende methoden gebruikt om toegang te krijgen tot bestanden. Standaard krijgt de lokale intranetzone het recht om dezelfde sitetoegang en directorytoegang te hebben, om verbinding te maken met de site van herkomst en om te lezen uit de installatiemap. Standaard krijgt de internetzone alleen het recht om verbinding te maken met de site van de oorsprong.
User-Specified-bestanden
Een manier om te kunnen omgaan met het niet hebben van machtigingen voor bestandstoegang is door de gebruiker te vragen om specifieke bestandsgegevens op te geven met behulp van de OpenFileDialog- of SaveFileDialog-klasse. Deze gebruikersinteractie biedt enige zekerheid dat de toepassing geen persoonlijke bestanden kan laden of belangrijke bestanden kan overschrijven. De methoden OpenFile en OpenFile bieden lees- en schrijftoegang door de bestandsstroom te openen voor het bestand dat de gebruiker heeft opgegeven. De methoden helpen ook het bestand van de gebruiker te beveiligen door het pad van het bestand te verdoezelen.
Notitie
Deze machtigingen verschillen, afhankelijk van of uw toepassing zich in de internetzone of intranetzone bevindt. Toepassingen in de internetzone kunnen alleen gebruikmaken van de OpenFileDialog, terwijl intranettoepassingen een onbeperkte machtiging voor bestandsdialoogvensters hebben.
De klasse FileDialogPermission geeft aan welk type bestandsdialoogvenster uw toepassing kan gebruiken. In de volgende tabel ziet u de waarde die u moet gebruiken voor elke FileDialog-klasse.
Klas | Vereiste toegangswaarde |
---|---|
OpenFileDialog | Open |
SaveFileDialog | Save |
Notitie
De specifieke machtiging wordt pas aangevraagd als de methode OpenFile daadwerkelijk wordt aangeroepen.
Autorisatie voor het weergeven van een bestandsdialoogvenster verleent uw toepassing geen volledige toegang tot alle leden van de FileDialog, OpenFileDialogen SaveFileDialog-klassen. Zie het naslagonderwerp voor die methode in de documentatie van de .NET Framework-klassebibliotheek voor de exacte machtigingen die nodig zijn om elke methode aan te roepen.
In het volgende codevoorbeeld wordt de OpenFile-methode gebruikt om een door de gebruiker opgegeven bestand te openen in een RichTextBox-controle-element. Voor het voorbeeld zijn FileDialogPermission en de bijbehorende opsommingswaarde Open vereist. In het voorbeeld ziet u hoe u de SecurityException kunt afhandelen om te bepalen of de opslagfunctie moet worden uitgeschakeld. In dit voorbeeld moet uw Form een Button besturingselement met de naam ButtonOpen
en een RichTextBox besturingselement met de naam RtfBoxMain
hebben.
Notitie
De programmeerlogica voor de functie Opslaan wordt niet weergegeven in het voorbeeld.
Private Sub ButtonOpen_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles ButtonOpen.Click
Dim editingFileName as String = ""
Dim saveAllowed As Boolean = True
' Displays the OpenFileDialog.
If (OpenFileDialog1.ShowDialog() = DialogResult.OK) Then
Dim userStream as System.IO.Stream
Try
' Opens the file stream for the file selected by the user.
userStream =OpenFileDialog1.OpenFile()
Me.RtfBoxMain.LoadFile(userStream, _
RichTextBoxStreamType.PlainText)
Finally
userStream.Close()
End Try
' Tries to get the file name selected by the user.
' Failure means that the application does not have
' unrestricted permission to the file.
Try
editingFileName = OpenFileDialog1.FileName
Catch ex As Exception
If TypeOf ex Is System.Security.SecurityException Then
' The application does not have unrestricted permission
' to the file so the save feature will be disabled.
saveAllowed = False
Else
Throw ex
End If
End Try
End If
End Sub
private void ButtonOpen_Click(object sender, System.EventArgs e)
{
String editingFileName = "";
Boolean saveAllowed = true;
// Displays the OpenFileDialog.
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
// Opens the file stream for the file selected by the user.
using (System.IO.Stream userStream = openFileDialog1.OpenFile())
{
this.RtfBoxMain.LoadFile(userStream,
RichTextBoxStreamType.PlainText);
userStream.Close();
}
// Tries to get the file name selected by the user.
// Failure means that the application does not have
// unrestricted permission to the file.
try
{
editingFileName = openFileDialog1.FileName;
}
catch (Exception ex)
{
if (ex is System.Security.SecurityException)
{
// The application does not have unrestricted permission
// to the file so the save feature will be disabled.
saveAllowed = false;
}
else
{
throw ex;
}
}
}
}
Notitie
Zorg ervoor dat u in Visual C# code toevoegt om de gebeurtenis-handler in te schakelen. Met behulp van de code uit het vorige voorbeeld laat de volgende code zien hoe u de gebeurtenis-handler inschakelt.this.ButtonOpen.Click += newSystem.Windows.Forms.EventHandler(this.ButtonOpen_Click);
Andere bestanden
Soms moet u bestanden lezen of schrijven die de gebruiker niet opgeeft, bijvoorbeeld wanneer u toepassingsinstellingen moet behouden. In de lokale intranet- en internetzones is uw toepassing niet gemachtigd om gegevens op te slaan in een lokaal bestand. Uw toepassing kan echter gegevens opslaan in geïsoleerde opslag. Geïsoleerde opslag is een abstract gegevenscompartiment (niet een specifieke opslaglocatie) die een of meer geïsoleerde opslagbestanden bevat, opslagbestanden genaamd, die de werkelijke maplocaties bevatten waar gegevens worden opgeslagen. Machtigingen voor bestandstoegang, zoals FileIOPermission zijn niet vereist; In plaats daarvan bepaalt de IsolatedStoragePermission klasse de machtigingen voor geïsoleerde opslag. Standaard kunnen toepassingen die worden uitgevoerd in het lokale intranet en internetzones gegevens opslaan met behulp van geïsoleerde opslag; Instellingen zoals schijfquotum kunnen echter variëren. Zie Geïsoleerde opslagvoor meer informatie over geïsoleerde opslag.
In het volgende voorbeeld wordt geïsoleerde opslag gebruikt om gegevens naar een bestand in een archief te schrijven. Voor het voorbeeld zijn IsolatedStorageFilePermission en de opsommingswaarde DomainIsolationByUser vereist. In het voorbeeld ziet u het lezen en schrijven van bepaalde eigenschapswaarden van het besturingselement Button naar een bestand in geïsoleerde opslag. De Read
-functie wordt aangeroepen nadat de toepassing is gestart en de Write
functie wordt aangeroepen voordat de toepassing eindigt. Het voorbeeld vereist dat de functies Read
en Write
bestaan als leden van een Form die een Button besturingselement met de naam MainButton
bevat.
' Reads the button options from the isolated storage. Uses Default values
' for the button if the options file does not exist.
Public Sub Read()
Dim isoStore As System.IO.IsolatedStorage.IsolatedStorageFile = _
System.IO.IsolatedStorage.IsolatedStorageFile. _
GetUserStoreForDomain()
Dim filename As String = "options.txt"
Try
' Checks to see if the options.txt file exists.
If (isoStore.GetFileNames(filename).GetLength(0) <> 0) Then
' Opens the file because it exists.
Dim isos As New System.IO.IsolatedStorage.IsolatedStorageFileStream _
(filename, IO.FileMode.Open,isoStore)
Dim reader as System.IO.StreamReader
Try
reader = new System.IO.StreamReader(isos)
' Reads the values stored.
Dim converter As System.ComponentModel.TypeConverter
converter = System.ComponentModel.TypeDescriptor.GetConverter _
(GetType(Color))
Me.MainButton.BackColor = _
CType(converter.ConvertFromString _
(reader.ReadLine()), Color)
me.MainButton.ForeColor = _
CType(converter.ConvertFromString _
(reader.ReadLine()), Color)
converter = System.ComponentModel.TypeDescriptor.GetConverter _
(GetType(Font))
me.MainButton.Font = _
CType(converter.ConvertFromString _
(reader.ReadLine()), Font)
Catch ex As Exception
Debug.WriteLine("Cannot read options " + _
ex.ToString())
Finally
reader.Close()
End Try
End If
Catch ex As Exception
Debug.WriteLine("Cannot read options " + ex.ToString())
End Try
End Sub
' Writes the button options to the isolated storage.
Public Sub Write()
Dim isoStore As System.IO.IsolatedStorage.IsolatedStorageFile = _
System.IO.IsolatedStorage.IsolatedStorageFile. _
GetUserStoreForDomain()
Dim filename As String = "options.txt"
Try
' Checks if the file exists, and if it does, tries to delete it.
If (isoStore.GetFileNames(filename).GetLength(0) <> 0) Then
isoStore.DeleteFile(filename)
End If
Catch ex As Exception
Debug.WriteLine("Cannot delete file " + ex.ToString())
End Try
' Creates the options.txt file and writes the button options to it.
Dim writer as System.IO.StreamWriter
Try
Dim isos As New System.IO.IsolatedStorage.IsolatedStorageFileStream _
(filename, IO.FileMode.CreateNew, isoStore)
writer = New System.IO.StreamWriter(isos)
Dim converter As System.ComponentModel.TypeConverter
converter = System.ComponentModel.TypeDescriptor.GetConverter _
(GetType(Color))
writer.WriteLine(converter.ConvertToString( _
Me.MainButton.BackColor))
writer.WriteLine(converter.ConvertToString( _
Me.MainButton.ForeColor))
converter = System.ComponentModel TypeDescriptor.GetConverter _
(GetType(Font))
writer.WriteLine(converter.ConvertToString( _
Me.MainButton.Font))
Catch ex as Exception
Debug.WriteLine("Cannot write options " + ex.ToString())
Finally
writer.Close()
End Try
End Sub
// Reads the button options from the isolated storage. Uses default values
// for the button if the options file does not exist.
public void Read()
{
System.IO.IsolatedStorage.IsolatedStorageFile isoStore =
System.IO.IsolatedStorage.IsolatedStorageFile.
GetUserStoreForDomain();
string filename = "options.txt";
try
{
// Checks to see if the options.txt file exists.
if (isoStore.GetFileNames(filename).GetLength(0) != 0)
{
// Opens the file because it exists.
System.IO.IsolatedStorage.IsolatedStorageFileStream isos =
new System.IO.IsolatedStorage.IsolatedStorageFileStream
(filename, System.IO.FileMode.Open,isoStore);
System.IO.StreamReader reader = null;
try
{
reader = new System.IO.StreamReader(isos);
// Reads the values stored.
TypeConverter converter ;
converter = TypeDescriptor.GetConverter(typeof(Color));
this.MainButton.BackColor =
(Color)(converter.ConvertFromString(reader.ReadLine()));
this.MainButton.ForeColor =
(Color)(converter.ConvertFromString(reader.ReadLine()));
converter = TypeDescriptor.GetConverter(typeof(Font));
this.MainButton.Font =
(Font)(converter.ConvertFromString(reader.ReadLine()));
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine
("Cannot read options " + ex.ToString());
}
finally
{
reader.Close();
}
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine
("Cannot read options " + ex.ToString());
}
}
// Writes the button options to the isolated storage.
public void Write()
{
System.IO.IsolatedStorage.IsolatedStorageFile isoStore =
System.IO.IsolatedStorage.IsolatedStorageFile.
GetUserStoreForDomain();
string filename = "options.txt";
try
{
// Checks if the file exists and, if it does, tries to delete it.
if (isoStore.GetFileNames(filename).GetLength(0) != 0)
{
isoStore.DeleteFile(filename);
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine
("Cannot delete file " + ex.ToString());
}
// Creates the options file and writes the button options to it.
System.IO.StreamWriter writer = null;
try
{
System.IO.IsolatedStorage.IsolatedStorageFileStream isos = new
System.IO.IsolatedStorage.IsolatedStorageFileStream(filename,
System.IO.FileMode.CreateNew,isoStore);
writer = new System.IO.StreamWriter(isos);
TypeConverter converter ;
converter = TypeDescriptor.GetConverter(typeof(Color));
writer.WriteLine(converter.ConvertToString(
this.MainButton.BackColor));
writer.WriteLine(converter.ConvertToString(
this.MainButton.ForeColor));
converter = TypeDescriptor.GetConverter(typeof(Font));
writer.WriteLine(converter.ConvertToString(
this.MainButton.Font));
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine
("Cannot write options " + ex.ToString());
}
finally
{
writer.Close();
}
}
DatabaseToegang
De machtigingen die nodig zijn voor toegang tot een database variëren op basis van de databaseprovider; Alleen toepassingen die met de juiste machtigingen worden uitgevoerd, hebben echter toegang tot een database via een gegevensverbinding. Zie Code Access Security en ADO.NETvoor meer informatie over de machtigingen die vereist zijn voor toegang tot een database.
Als u geen rechtstreeks toegang hebt tot een database omdat u wilt dat uw toepassing in gedeeltelijke vertrouwensrelatie wordt uitgevoerd, kunt u een webservice gebruiken als alternatief voor toegang tot uw gegevens. Een webservice is een stukje software dat programmatisch kan worden geopend via een netwerk. Met webservices kunnen toepassingen gegevens delen in codegroepzones. Standaard krijgen toepassingen in het lokale intranet en internetzones het recht om toegang te krijgen tot hun sites van oorsprong, waardoor ze een webservice kunnen aanroepen die op dezelfde server wordt gehost. Zie Web Services in ASP.NET AJAX- of Windows Communication Foundation-voor meer informatie.
Registertoegang
De RegistryPermission klasse beheert de toegang tot het besturingssysteemregister. Standaard hebben alleen toepassingen die lokaal worden uitgevoerd, toegang tot het register. RegistryPermission verleent een toepassing alleen het recht om registertoegang te proberen; het garandeert niet dat de toegang slaagt, omdat het besturingssysteem nog steeds beveiliging afdwingt in het register.
Omdat u geen toegang hebt tot het register onder gedeeltelijke vertrouwensrelatie, moet u mogelijk andere methoden voor het opslaan van uw gegevens vinden. Wanneer u toepassingsinstellingen opslaat, gebruikt u geïsoleerde opslag in plaats van het register. Geïsoleerde opslag kan ook worden gebruikt voor het opslaan van andere toepassingsspecifieke bestanden. U kunt ook algemene toepassingsinformatie over de server of site van oorsprong opslaan, omdat standaard een toepassing het recht krijgt om toegang te krijgen tot de site van de oorsprong ervan.
Zie ook
- veiliger afdrukken in Windows Forms
- Aanvullende beveiligingsoverwegingen in Windows Forms
- Overzicht van beveiliging in Windows Forms
- Windows Forms-beveiliging
- Mage.exe (hulpprogramma voor het genereren en bewerken van manifesten)
- MageUI.exe (hulpprogramma voor het genereren en bewerken van manifesten, grafische client)
.NET Desktop feedback