Zulassen von teilweise vertrauenswürdigen Aufrufern

Die gemeinsame Nutzung von Codebibliotheken ist bei der CLR-Integration gängige Praxis. Hierbei greift eine Assembly oder Anwendung häufig auf eine andere Assembly zu, die einen benutzerdefinierten Typ, eine gespeicherte Prozedur, eine benutzerdefinierte Funktion, ein benutzerdefiniertes Aggregat, einen Trigger oder eine Hilfsprogrammklasse enthält. Codebibliotheken, die von mehreren Anwendungen genutzt werden sollen, müssen mit einem starken Namen signiert werden.

Nur Anwendungen, die vom Sicherheitssystem für den Laufzeitcodezugriff als voll vertrauenswürdig angesehen werden, erhalten Zugriff auf eine freigegebene Assembly mit verwaltetem Code, die nicht explizit mit dem System.Security.AllowPartiallyTrustedCallers-Attribut markiert ist. Wenn eine teilweise vertrauenswürdige Assembly (eine Assembly, die in SQL Server mit der Berechtigung SAFE oder EXTERNAL_ACCESS registriert ist) versucht, auf eine mit einem starken Namen signierte Assembly ohne dieses Attribut zuzugreifen, dann wird eine Ausnahme des Typs System.Security.SecurityException ausgelöst. Die Fehlermeldung lautet wie folgt oder ähnlich:

Msg 6522, Level 16, State 1, Procedure usp_RSTest, Line 0
A .NET Framework error occurred during execution of user defined
routine or aggregate 'usp_RSTest':  System.Security.SecurityException: That assembly does not allow partially trusted callers.
System.Security.SecurityException: at
System.Security.CodeAccessSecurityEngine.ThrowSecurityException(
Assembly asm, PermissionSet granted,PermissionSet refused,
RuntimeMethodHandle rmh, SecurityAction action, Object demand,
IPermission permThatFailed) at
Microsoft.Samples.SqlServer.TestResultSet.Test()

Es wird empfohlen, alle in SQL Server registrierten Assemblys, mit Ausnahme der Assemblys, die dem globalen Assemblycache hinzugefügt werden, mit dem AtAllowPartiallyTrustedCallers-Attribut zu markieren, sodass die von SQL Server geladenen Assemblys aufeinander zugreifen können. Assemblys, die dem globalen Assemblycache hinzugefügt werden, sollten aus Sicherheitsgründen gründlich überprüft werden, bevor das AllowPartiallyTrustedCallers-Attribut hinzugefügt wird, da die Assembly dann für teilweise vertrauenswürdige Aufrufer aus unerwarteten Kontexten verfügbar ist. Eine Assembly sollte nicht als voll vertrauenswürdig gekennzeichnet (in SQL Server mit der UNSAFE-Berechtigung registriert) werden.

Weitere Informationen finden Sie im Abschnitt "Verwenden von Bibliotheken aus teilweise vertrauenswürdigem Code" im .NET Framework Software Development Kit.

Beispiel

Angenommen, es gibt eine Hilfsprogrammmklasse, die für viele serverseitige CLR-Integrationsanwendungen nützlich wäre. Zum Beispiel könnte es eine Klasse sein, die die Ergebnisse einer Abfrage darstellt. Um die gemeinsame Nutzung dieser Komponente zu ermöglichen, wird diese Hilfsprogrammmklasse in eine separate Assembly eingefügt. Dann wird von verschiedenen anderen Assemblys, die CLR-Integrationsobjekte enthalten, auf diese Assembly verwiesen. Da diese Hilfsprogrammmklasse in vielen verschiedenen Serveranwendungen verwendet wird, wird sie sorgfältig überprüft. Alle eventuell vorhandenen Sicherheitsrisiken werden beseitigt. Dann wird das AllowPartiallyTrustedCallers-Attribut der Assembly, die die Hilfsprogrammmklasse enthält, zugeordnet, sodass die in den mit den Berechtigungssätzen SAFE oder EXTERNAL_ACCESS markierten Assemblys enthaltenen CLR-Integrationsobjekte die Hilfsprogrammmklasse und deren Methoden nutzen können, obwohl sie sich in einer getrennten Assembly befinden. Ein Beispiel, wie das AllowPartiallyTrustedCallers-Attribut verwendet wird, finden Sie im Resultsetbeispiel auf CodePlex; weitere Informationen finden Sie unter Beispiele für SQL Server Database Engine.

Siehe auch

Konzepte