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
相关产品推荐
相关产品推荐

