使用ITfoxtec.Identity.Saml2解析Saml2LogoutRequest时NameQualifier与SPNameQualifier为空
问题:ITfoxtec.Identity.Saml2解析LogoutRequest时NameId的NameQualifier/SPNameQualifier为空
我在用ITfoxtec.Identity.Saml2处理SAML注销请求时遇到了问题:请求XML里的<saml2:NameID>节点明明带有NameQualifier和SPNameQualifier属性,但通过代码获取这两个值时始终为空,只有Value和Format能正常拿到。
我的代码如下:
Saml2LogoutRequest logoutRequest = new Saml2LogoutRequest(config); var binding = new Saml2PostBinding(); binding.ReadSamlRequest(Request.ToGenericHttpRequest(), logoutRequest); string spNameQualifier = logoutRequest.NameId.SPNameQualifier; string nameQualifier = logoutRequest.NameId.NameQualifier; string nameIdValue = logoutRequest.NameId.Value;
请求XML的关键部分:
<saml2:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient" NameQualifier="{expectedNameQualifier}" SPNameQualifier="{expectedSPNameQualifier}" xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"> {expectedAndRecievedValue} </saml2:NameID>
解决办法
核心原因
ITfoxtec.Identity.Saml2的Saml2NameIdentifier类(即logoutRequest.NameId的类型),默认XML序列化配置没有对NameQualifier和SPNameQualifier这两个属性做映射,导致解析时这两个值不会自动填充到对象属性中。
方案1:直接读取原始XML节点(快速生效)
无需修改框架类,解析请求后手动从原始XML提取这两个属性:
// 读取原始SAML XML内容 var samlXml = binding.ReadSamlRequest(Request.ToGenericHttpRequest()); // 将XML解析到logoutRequest对象 logoutRequest.ReadXml(XDocument.Parse(samlXml).Root); // 定位到NameID节点 var nameIdNode = XDocument.Parse(samlXml).Root .Element(XName.Get("NameID", "urn:oasis:names:tc:SAML:2.0:assertion")); if (nameIdNode != null) { string spNameQualifier = nameIdNode.Attribute("SPNameQualifier")?.Value; string nameQualifier = nameIdNode.Attribute("NameQualifier")?.Value; // 编写后续处理逻辑 }
方案2:扩展框架类(长期复用)
如果项目需要频繁使用这两个属性,可以自定义继承自Saml2NameIdentifier的类,添加对应的XML属性标记:
public class CustomSaml2NameId : Saml2NameIdentifier { [XmlAttribute("NameQualifier")] public new string NameQualifier { get; set; } [XmlAttribute("SPNameQualifier")] public new string SPNameQualifier { get; set; } }
之后可修改Saml2LogoutRequest的NameId属性类型为自定义类(需注意框架兼容性),或在解析时手动替换,后续就能直接通过对象属性获取值。
额外提醒
检查你的ITfoxtec.Identity.Saml2版本,部分旧版本确实存在这个解析遗漏的问题。如果是旧版本,直接升级到最新稳定版,大概率已修复该bug。
内容的提问来源于stack exchange,提问作者Maciej
相关产品推荐
相关产品推荐

