System.Xml.XmlSecureResolver 类

本文提供了此 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 的策略解析机制不使用 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. 创建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/")

使用权限集限制访问

  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)