You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DTD报错问题:部分XML处理方法执行失败,提示DTD被禁止如何解决

问题根因

你调用的SAML组件加载IdP元数据XML文件时,.NET底层的XmlReader出于防范XXE注入攻击的安全考虑,默认禁用了DTD解析功能,但你配置的IdP返回的元数据XML中包含DTD定义,因此触发了安全校验报错。

解决方案

根据你使用的类库不同,可选择对应处理方案:

场景1:使用ITfoxtec.Identity.Saml2类库(ReadIdPSsoDescriptorFromUrl为该类库内置方法)

不直接调用从URL读取的封装方法,先手动下载元数据,自定义XmlReader配置开启DTD处理后再解析,操作步骤如下:

  • 手动下载IdP元数据内容
  • 自定义XmlReader配置,开启DTD处理同时限制安全风险
  • 用自定义配置的XmlReader加载解析元数据

示例代码:

// 手动下载IdP元数据内容
using var httpClient = new HttpClient();
string metadataContent = await httpClient.GetStringAsync(Configuration["Saml2:IdPMetadata"]);

// 自定义XmlReader配置,开启DTD处理同时限制安全风险
var xmlReaderSettings = new XmlReaderSettings
{
    DtdProcessing = DtdProcessing.Parse,
    XmlResolver = null, // 禁止解析外部实体,避免XXE攻击
    MaxCharactersFromEntities = 1024 // 限制实体展开最大字符数
};

// 用自定义配置的XmlReader加载解析元数据
using var xmlReader = XmlReader.Create(new StringReader(metadataContent), xmlReaderSettings);
entityDescriptor.ReadIdPSsoDescriptor(xmlReader);

场景2:使用自定义封装的SAML类库

找到类库内部读取XML元数据的底层代码,修改XmlReader初始化逻辑,将开启DtdProcessing = DtdProcessing.Parse的XmlReaderSettings配置传入XmlReader.Create方法即可。

安全提醒

开启DTD解析存在XXE注入攻击风险,建议仅对完全信任的IdP元数据地址使用该配置,务必搭配XmlResolver = null、限制实体字符长度等安全参数降低风险。

内容的提问来源于stack exchange,提问作者Mateusz Kaleta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:36:09