本文提供了此 API 参考文档的补充说明。
该 XmlUrlResolver 类是命名空间中 System.Xml 所有类的默认解析程序。 它用于加载 XML 文档和解析外部资源(如实体、DTD 或架构),以及导入或包含指令。
可以通过指定对象 XmlResolver 来替代此默认值。 例如,如果要限制基础 XmlResolver 可以访问的资源,可以使用对象 XmlSecureResolver 。
XmlSecureResolver 包装 XmlResolver 的一个具体实现,并限制基础 XmlResolver 有权访问的资源。 例如, XmlSecureResolver 能够禁止跨域重定向,这发生在嵌入的统一资源标识符(URI)引用中。
构造对象 XmlSecureResolver 时,提供有效的 XmlResolver 实现以及 URL、证据对象的实例或权限集,供 XmlSecureResolver 确定安全性使用。 生成一个 System.Security.PermissionSet 或使用现有的 System.Security.PermissionSet,并在其上调用 XmlResolver 以帮助保护底层的 。
重要
XmlSecureResolver 对象可以包含敏感信息,例如用户凭据。 缓存 XmlSecureResolver 对象时要小心,不应将 XmlSecureResolver 对象传递给不受信任的组件。
重要
在 .NET 公共语言运行时(CLR)上运行的代码的安全基础结构和在 MICROSOFT SQL Server 2005 中集成的 CLR 上运行的代码存在差异。 这可能会导致在 SQL Server 集成 CLR 上使用时为 .NET CLR 开发的代码以不同的方式运行的情况。 当你有基于 URL 的证据(即使用XmlSecureResolver方法或CreateEvidenceForUrl(String)构造函数时),其中一个差异会影响XmlSecureResolver类。 SQL Server 集成 CLR 的策略解析机制不使用 Url 或 Zone 信息。 而是根据服务器在加载程序集时添加的 GUID 授予权限。 在 SQL Server 集成 CLR 中使用 XmlSecureResolver 时,通过使用指定的 PermissionSet 直接提供所需的任何证据。
使用安全解析器
使用正确的权限集创建一个 XmlSecureResolver 。
创建一个XmlReaderSettings对象,该对象使用XmlSecureResolver对象。
XmlReaderSettings settings = new XmlReaderSettings(); settings.XmlResolver = myResolver;
Dim settings As New XmlReaderSettings() settings.XmlResolver = myResolver
创建XmlReaderSettings对象时,将Create对象传递给XmlReader方法。
XmlReader reader = XmlReader.Create("books.xml", settings);
Dim reader As XmlReader = XmlReader.Create("books.xml", settings)
使用 URL 限制访问
使用XmlSecureResolver(XmlResolver, String)构造函数来创建一个XmlSecureResolver对象,该对象仅被允许访问你的本地内联网站点。
XmlSecureResolver myResolver = new XmlSecureResolver(new XmlUrlResolver(), "http://myLocalSite/");
Dim myResolver As New XmlSecureResolver(New XmlUrlResolver(), "http://myLocalSite/")
使用权限集限制访问
创建 WebPermission 对象。
WebPermission myWebPermission = new WebPermission(PermissionState.None);
Dim myWebPermission As New WebPermission(PermissionState.None)
指定要允许访问的 URL。
myWebPermission.AddPermission(NetworkAccess.Connect, "http://www.contoso.com/"); myWebPermission.AddPermission(NetworkAccess.Connect, "http://litwareinc.com/data/");
myWebPermission.AddPermission(NetworkAccess.Connect, "http://www.contoso.com/") myWebPermission.AddPermission(NetworkAccess.Connect, "http://litwareinc.com/data/")
将 Web 权限添加到 PermissionSet 对象。
PermissionSet myPermissions = new PermissionSet(PermissionState.None); myPermissions.AddPermission(myWebPermission);
Dim myPermissions As New PermissionSet(PermissionState.None) myPermissions.AddPermission(myWebPermission)
使用XmlSecureResolver(XmlResolver, PermissionSet)构造函数,通过权限集创建XmlSecureResolver对象。
XmlSecureResolver myResolver = new XmlSecureResolver(new XmlUrlResolver(), myPermissions);
Dim myResolver As New XmlSecureResolver(New XmlUrlResolver(), myPermissions)
请参阅XmlSecureResolver参考页以获取另一个示例。
使用证据限制访问
可以通过使用XmlSecureResolver(XmlResolver, Evidence)构造函数并指定Evidence来限制访问。 使用Evidence来创建应用于基础PermissionSet的XmlResolver。 在打开任何资源之前,XmlSecureResolver 在已创建的 PermitOnly 上调用 PermissionSet。
下面是一些常见方案和为每个方案提供的证据类型:
如果在完全信任的环境中工作,请使用程序集来创建证据:
Evidence myEvidence = this.GetType().Assembly.Evidence; XmlSecureResolver myResolver; myResolver = new XmlSecureResolver(new XmlUrlResolver(), myEvidence);
Dim myEvidence As Evidence = Me.GetType().Assembly.Evidence Dim myResolver As XmlSecureResolver myResolver = New XmlSecureResolver(New XmlUrlResolver(), myEvidence)
如果在半受信任的环境中工作,则具有来自外部源的代码或数据,并且知道外部源的来源并具有可验证 URI,请使用 URI 创建证据:
Evidence myEvidence = XmlSecureResolver.CreateEvidenceForUrl(sourceURI); XmlSecureResolver myResolver = new XmlSecureResolver(new XmlUrlResolver(), myEvidence);
Dim myEvidence As Evidence = XmlSecureResolver.CreateEvidenceForUrl(sourceURI) Dim myResolver As New XmlSecureResolver(New XmlUrlResolver(), myEvidence)
如果在半受信任的环境中工作,并且代码或数据来自外部源,但你也不知道外部源的来源:
将
evidence
参数设置为null
。 这样就不能访问资源。-或-
如果应用程序需要对资源进行一些访问,请从调用方请求证据。
使用安全解析程序加载 XSLT 样式表
使用正确的权限集创建一个 XmlSecureResolver 。
将XmlSecureResolver传递给Load方法。
XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load("http://serverName/data/xsl/sort.xsl", null, myResolver);
Dim xslt As New XslCompiledTransform() xslt.Load("http://serverName/data/xsl/sort.xsl", Nothing, myResolver)