允许部分可信任的调用方

对于公共语言运行时 (CLR) 集成而言,共享代码库是一种常见方案。其中包含用户定义类型、存储过程、用户定义函数、用户定义聚合、触发器或实用工具类的程序集通常可由另一个程序集或应用程序进行访问。要由多个应用程序共享的代码库必须使用强名称进行签名。

只有运行时代码访问安全性系统完全信任的应用程序才允许访问未用 System.Security.AllowPartiallyTrustedCallers 属性显式标记的共享托管代码程序集。在未使用此属性的情况下,部分可信任的程序集(即在 SQL Server 中使用 SAFE 或 EXTERNAL_ACCESS 权限集注册的程序集)尝试访问使用强名称签名的程序集时,会导致引发 System.Security.SecurityException 异常。您会看到如下错误消息:

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

建议所有在 SQL Server 中注册的程序集(添加到全局程序集缓存中的那些程序集除外)使用 AllowPartiallyTrustedCallers 属性进行标记,以便由 SQL Server 加载的程序集可以相互访问。应当首先彻底检查要加载到全局程序集缓存中的程序集的安全性,然后再添加 AllowPartiallyTrustedCallers 属性,因为之后该程序集将可用于来自意外上下文的部分可信任的调用方。程序集不应注册为完全可信任(在 SQL Server 中使用 UNSAFE 权限集注册)。

有关详细信息,请参阅 .NET Framework 软件开发包中的“通过部分可信任的代码使用库”部分。

示例

假设有一个实用工具类对许多服务器端 CLR 集成应用程序都非常有用。例如,它可能是一个表示查询调用结果的类。若要启用对此组件的共享,请将此实用工具类置于单独的程序集中。然后,即可从包含 CLR 集成对象的各种其他程序集引用该程序集。因为此实用工具类可用于多个不同的服务器应用程序,所以应仔细检查并解决任何安全问题。然后,将 AllowPartiallyTrustedCallers 属性应用于包含此实用工具类的程序集,以便通过 SAFE 或 EXTERNAL_ACCESS 权限集标记的程序集中包含的 CLR 集成对象可以使用此实用工具类和方法,即使此实用工具类和方法位于单独的程序集中。有关如何使用 AllowPartiallyTrustedCallers 属性的示例,请参阅 CodePlex 上提供的结果集示例;有关详细信息,请参阅 SQL Server 数据库引擎示例

请参阅

概念