Autorisation d'appelants partiellement approuvés

Le partage de bibliothèques de code est un scénario courant avec l'intégration du Common Language Runtime (CLR), dans lequel un assembly qui contient un type défini par l'utilisateur, une procédure stockée, une fonction définie par l'utilisateur, un agrégat défini par l'utilisateur, un déclencheur ou une classe utilitaire est souvent accédé par un autre assembly ou application. Les bibliothèques de code qui doivent être partagées par plusieurs applications doivent être signées avec un nom fort.

Seules les applications approuvées complètement par le système de sécurité d'accès du code au moment de l'exécution sont autorisées à accéder à un assembly de code managé partagé qui n'est pas marqué explicitement avec l'attribut System.Security.AllowPartiallyTrustedCallers. Un assembly partiellement approuvé (assembly inscrit dans SQL Server avec le jeu d'autorisations SAFE ou EXTERNAL_ACCESS) qui tente d'accéder à un assembly signé avec nom fort sans cet attribut provoque la levée d'une exception System.Security.SecurityException. Le message d'erreur affiché est semblable au suivant :

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()

Nous recommandons que tous les assemblys inscrits dans SQL Server, sauf ceux ajoutés au Global Assembly Cache, soient marqués avec l'attribut AllowPartiallyTrustedCallers afin que les assemblys chargés par SQL Server puissent accéder les uns aux autres. Les assemblys qui doivent être ajoutés au Global Assembly Cache doivent être examinés minutieusement afin de vérifier leur sécurité avant l'ajout de l'attribut AllowPartiallyTrustedCallers, car ces assemblys seront ensuite accessibles aux appelants partiellement approuvés à partir de contextes inattendus. Un assembly ne doit pas être validé comme approuvé complètement (inscrit avec le jeu d'autorisations UNSAFE dans SQL Server).

Pour plus d'informations, consultez la section « Utilisation de bibliothèques à partir de code d'un niveau de confiance partiel » dans le kit de développement logiciel (SDK) .NET Framework.

Exemple

Supposez une classe utilitaire qui serait utile pour de nombreuses applications d'intégration du CLR côté serveur. Par exemple, il peut s'agir d'une classe qui représente les résultats de l'appel d'une requête. Pour activer le partage de ce composant, cette classe utilitaire est placée dans un assembly séparé. Ensuite, cet assembly est référencé à partir de différents autres assemblys qui contiennent des objets d'intégration CLR. Cette classe utilitaire étant utilisée dans de nombreuses applications serveur différentes, elle est examinée avec soin et les éventuels problèmes de sécurité sont résolus. L'attribut AllowPartiallyTrustedCallers est ensuite appliqué à l'assembly qui contient la classe utilitaire, afin que les objets d'intégration CLR contenus dans les assemblys marqués avec le jeu d'autorisations SAFE ou EXTERNAL_ACCESS puissent utiliser la classe utilitaire et les méthodes, bien qu'elles soient dans un assembly distinct. Pour obtenir un exemple de la façon dont l'attribut AllowPartiallyTrustedCallers est utilisé, consultez l'exemple de jeu de résultats disponible sur CodePlex ; consultez Exemples pour le moteur de base de données SQL Server pour plus d'informations.