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

ASP.NET Core集成Okta SAML认证报DTD is prohibited错误如何解决

错误原因

DTD is prohibited是.NET XML解析器的默认安全拦截逻辑:默认禁止解析XML里的DTD声明,阻断XXE(XML外部实体注入)攻击路径。这个场景触发错误基本是两个原因,按顺序排查即可:


1. 修正IdPMetadata配置项

你贴的appSettings.json里IdPMetadata的值是占位符"Url of my app",不是Okta的IdP元数据地址。如果运行时这里填的是自己应用的首页、回调地址,请求拉回来的是带<!DOCTYPE html>声明的HTML页面,XML解析器读到DOCTYPE(本质就是DTD)就会直接抛这个错。
正确值填Okta后台对应SAML应用的元数据地址即可,进入你创建的SAML应用的Sign On配置页就能找到,地址为Okta租户域名下对应应用的metadata路径。

2. 调整元数据读取逻辑(配置正确仍报错时处理)

如果确认填的是正确的Okta元数据地址还是报错,是你使用的ITfoxtec.Identity.Saml2版本偏旧,内置的XML读取配置没适配.NET Core的默认安全规则。不要直接调用ReadIdPSsoDescriptorFromUrl方法,手动拉取元数据、给可信来源的元数据单独开DTD解析权限,同时做好安全限制:
把原来的这段代码:

var entityDescriptor = new EntityDescriptor();
entityDescriptor.ReadIdPSsoDescriptorFromUrl(new Uri(Configuration["Saml2:IdPMetadata"]));

替换为:

var entityDescriptor = new EntityDescriptor();
using var httpClient = new HttpClient();
// 同步拉取元数据,适配ConfigureServices的同步上下文
var metadataContent = httpClient.GetStringAsync(new Uri(Configuration["Saml2:IdPMetadata"])).GetAwaiter().GetResult();

var xmlReadSettings = new XmlReaderSettings
{
    DtdProcessing = DtdProcessing.Parse,
    XmlResolver = null, // 禁用外部实体解析,阻断XXE风险
    MaxCharactersFromEntities = 1024 // 限制实体展开大小,防XML炸弹攻击
};
using var xmlReader = XmlReader.Create(new StringReader(metadataContent), xmlReadSettings);
var metadataDoc = new XmlDocument();
metadataDoc.Load(xmlReader);

entityDescriptor.ReadIdPSsoDescriptor(metadataDoc);

不要全局修改XML解析的默认配置,只在读取你确认可信的Okta元数据时使用上面的受限配置,避免引入安全漏洞。

3. 升级依赖包

直接把ITfoxtec.Identity.Saml2升级到最新稳定版,新版本已经修复了元数据读取时的DTD配置问题,升级后不需要手动写上面的XML加载逻辑,原方法就能正常解析Okta返回的元数据。


验证

改完重启应用,触发登录跳转:

  • 能正常跳转到Okta登录页就是修复完成
  • 还报错的话直接在浏览器访问你配置的IdPMetadata地址,确认返回的是纯XML格式的SAML元数据,不是登录跳转页、404页或者其他HTML内容。

内容的提问来源于stack exchange,提问作者Mumtaz Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:06:19