我正在构建一个SAML IdP来处理学生门户和第三方系统之间的SSO。我的代码基于CoverMyMeds Test Harness,我在我的项目中使用了一些未更改的库。我还设置了他们的样本身份提供程序,以便更容易地调试此问题。
我构建此基础以处理身份验证的页面从学生门户获取GUID,使用它从内部服务检索学生详细信息并将其打包成SAML断言,然后使用x.509证书进行签名在将其发送给第三方SAML服务提供商之前。我在这里被卡住了。在尝试签署SAML请求时,我收到:
我所做的调试和研究似乎表明代码不是问题,但只是让你理解我是如何到达的:ComputeSignature()
来自CertificateUtility -> AppendSignatureToXMLDocument method,{正在从SAML20Assertion -> SerializeAndSignSAMLResponse method调用,IdPLauncher.aspx page间接调用它。
This is what the assertion looks like。我已经彻底检查了这一点并通过调试器运行它而没有发现问题。
我的假设是证书有问题,为了测试目的而自签名。我正在与之合作的公司向我保证,其他已集成的人过去曾使用过测试证书,但我认为没有其他理由可以解决这个问题。虽然我尝试了很多变化,但我认为最有可能根据我的研究生成工作测试证书的命令是:makecert.exe -a md5 -r -pe -n "CN=iGradTest" -ss my -sr localmachine -sky signature "c:\iGradTest.cer"
,但结果证书仍然存在同样的问题。生成的证书已被赋予友好名称,并设置为使用winhttpcertcfg与IIS协同工作。应用程序成功获取证书,但在尝试将其添加到断言时失败。
我不知道接下来要做什么。任何有关识别和解决此问题的后续步骤的建议将不胜感激。感谢您抽出时间阅读/协助。
答案 0 :(得分:3)
您遇到的异常意味着引用的URI
无法解析为标记有ID
属性的其他元素。
根据提供的代码,SAML20Assertion.cs:90在#
前面加上ID,然后CertificateUtility.cs:69再次在它前面加上它。将其从其中一个位置移除,一切都很顺利。
SAML20Assertion.cs:90:
CertificateUtility.AppendSignatureToXMLDocument(ref xmlResponse, "#" + ((AssertionType)Response.Items[0]).ID, SigningCert);
应该是
CertificateUtility.AppendSignatureToXMLDocument(ref xmlResponse, ((AssertionType)Response.Items[0]).ID, SigningCert);