System.Xml.XmlSecureResolver 类

本文提供了此 API 参考文档的补充说明。

XmlUrlResolver 类是 System.Xml 命名空间中所有类的默认解析器。 该类用于加载 XML 文档、解析外部资源(例如实体、DTD 或架构)以及导入或包含指令。

可以通过指定要使用的 XmlResolver 对象来重写此默认值。 例如,如果要限制基础 XmlResolver 可以访问的资源,可以使用 XmlSecureResolver 对象。

XmlSecureResolver 包装 XmlResolver 的一个具体实现,并限制基础 XmlResolver 有权访问的资源。 例如,XmlSecureResolver 能够禁止跨域重定向,这种重定向会通过嵌入的统一资源标识符 (URI) 引用发生。

构造 XmlSecureResolver 对象时,请提供有效的 XmlResolver 实现以及 URL、证据对象实例或权限集,供 XmlSecureResolver 用于确定安全性。 生成一个 System.Security.PermissionSet 或使用现有的该项,并对其调用 PermissionSet.PermitOnly 以帮助保护基础 XmlResolver

重要

XmlSecureResolver 对象可以包含敏感信息,例如用户凭据。 在缓存 XmlSecureResolver 对象时务必谨慎操作,并且不应将 XmlSecureResolver 对象传递给不受信任的组件。

重要

在 .NET 公共语言运行时 (CLR) 上运行的代码和在 Microsoft SQL Server 2005 中集成的 CLR 上运行的代码的安全基础结构存在差异。 这可能会导致为 .NET CLR 开发的代码在 SQL Server 集成 CLR 上使用时以不同方式运行。 当你有基于 URL 的证据(即使用 XmlSecureResolver 方法或 CreateEvidenceForUrl(String) 构造函数)时,其中一个差异会影响 XmlSecureResolver 类。 SQL Server 集成 CLR 的策略解析机制不使用 UrlZone 信息。 而是根据服务器在加载程序集时添加的 GUID 授予权限。 在 SQL Server 集成 CLR 中使用 XmlSecureResolver 时,请使用指定的 PermissionSet 直接提供任何所需的证据。

使用安全解析程序

  1. 使用正确的权限集创建 XmlSecureResolver 对象。

  2. 创建使用 XmlReaderSettings 对象的 XmlSecureResolver 对象。

    XmlReaderSettings settings = new XmlReaderSettings();
    settings.XmlResolver = myResolver;
    
    Dim settings As New XmlReaderSettings()
    settings.XmlResolver = myResolver
    
  3. 创建 XmlReader 对象时,将 XmlReaderSettings 对象传递给 Create 方法。

    XmlReader reader = XmlReader.Create("books.xml", settings);
    
    Dim reader As XmlReader = XmlReader.Create("books.xml", settings)
    

使用 URL 限制访问

使用 XmlSecureResolver(XmlResolver, String) 构造函数创建一个仅允许其访问本地 Intranet 站点的 XmlSecureResolver 对象。

XmlSecureResolver myResolver = new XmlSecureResolver(new XmlUrlResolver(), "http://myLocalSite/");
Dim myResolver As New XmlSecureResolver(New XmlUrlResolver(), "http://myLocalSite/")

使用权限集限制访问

  1. 创建 WebPermission 对象。

    WebPermission myWebPermission = new WebPermission(PermissionState.None);
    
    Dim myWebPermission As New WebPermission(PermissionState.None)
    
  2. 指定要允许访问的 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/")
    
  3. 将 Web 权限添加到 PermissionSet 对象中。

    PermissionSet myPermissions = new PermissionSet(PermissionState.None);
    myPermissions.AddPermission(myWebPermission);
    
    Dim myPermissions As New PermissionSet(PermissionState.None)
    myPermissions.AddPermission(myWebPermission)
    
  4. 使用 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 用于创建应用于基础 PermissionSetXmlResolver。 在打开任何资源之前,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 样式表

  1. 使用正确的权限集创建 XmlSecureResolver 对象。

  2. 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)