我正在尝试实现SAML 2.0连接。我已经做了很多搜索,而且我发现使用ColdFusion最接近示例代码的是:
http://dragonsaber.blogspot.com/2009/09/coldfusion-saml-part-1.html
http://dragonsaber.blogspot.com/2010/01/coldfusion-saml-part-2.html
http://dragonsaber.blogspot.com/2010/04/coldfusion-saml-part-3.html
http://philduba.com/default/assets/File/BeyondEncryp-cfobjective-2013.pdf
下面是我执行代码的片段。我的目标ColdFusion平台是版本10.
<cfscript>
ssouser = {
'email': 'user@domain.com',
'name': 'User',
'uuid': CreateUUID()
};
nowDateTime = DateFormat(DateConvert('local2utc', Now()), 'YYYY-MM-DDT') & TimeFormat(DateConvert('local2utc', Now()), 'HH:mm:SS.LZ');
nowDateTimePlus1 = DateFormat(DateConvert('local2utc', Now()), 'YYYY-MM-DDT') & TimeFormat(DateConvert('local2utc', DateAdd('n', 1, Now())), 'HH:mm:SS.LZ');
IDPDomain = "idp.domain.com";
SPService = "sp.domain.com";
SPDomain = "domain.com";
</cfscript>
<cfoutput>
<cfxml variable="samlAssertionXML">
<?xml version="1.0" encoding="UTF-8"?>
<samlp:Response Destination="#SPService#" ID="#ssouser.uuid#" IssueInstant="#nowDateTime#" Version="2.0" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">#IDPDomain#</saml:Issuer>
<samlp:Status>
<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
</samlp:Status>
<saml:Assertion ID="#ssouser.uuid#" IssueInstant="#nowDateTime#" Version="2.0" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
<saml:Issuer>#IDPDomain#</saml:Issuer>
<saml:Subject>
<saml:NameID>#ssouser.email#</saml:NameID>
<saml:SubjectConfirmation Method="urn:oasis:names:tc:2.0:cm:bearer">
<saml:SubjectConfirmationData InResponseTo="#ssouser.uuid#" NotOnOrAfter="#nowDateTimePlus1#" Recipient="#SPService#"/>
</saml:SubjectConfirmation>
</saml:Subject>
<saml:Conditions NotBefore="#nowDateTime#" NotOnOrAfter="#nowDateTimePlus1#">
<saml:AudienceRestriction>
<saml:Audience>#SPDomain#</saml:Audience>
</saml:AudienceRestriction>
</saml:Conditions>
<saml:AuthnStatement AuthnInstant="#nowDateTime#">
<saml:AuthnContext>
<saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef>
</saml:AuthnContext>
</saml:AuthnStatement>
<saml:AttributeStatement>
<saml:Attribute Name="screenName">
<saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">#ssouser.name#</saml:AttributeValue>
</saml:Attribute>
</saml:AttributeStatement>
</saml:Assertion>
</samlp:Response>
</cfxml>
</cfoutput>
<cfscript>
// 1) Injest the XML
samlAssertionElement = samlAssertionXML.getDocumentElement();
samlAssertionDocument = samlAssertionElement.GetOwnerDocument();
samlAssertion = samlAssertionDocument.getFirstChild();
//writedump(samlAssertionDocument); // show variable type of samlAssertionDocument
//abort;
// 2) Create Java Objects
SignatureSpecNS = CreateObject("Java", "org.apache.xml.security.utils.Constants").SignatureSpecNS;
SecInit = CreateObject("Java", "org.apache.xml.security.Init").Init().init();
XMLSignatureClass = CreateObject("Java", "org.apache.xml.security.signature.XMLSignature"); // Access XML Signature CLASS
CanonicalizerClass = CreateObject("Java", "org.apache.xml.security.c14n.Canonicalizer"); // Access Canonicalizer CLASS
// 3) Signature
sigType = XMLSignatureClass.ALGO_ID_SIGNATURE_RSA_SHA1; // Define signature algorithm
canonType = CanonicalizerClass.ALGO_ID_C14N_EXCL_OMIT_COMMENTS; // Define canonicalizer algorithm
// init fails on the next line.
signature = XMLSignatureClass.init(samlAssertionDocument, javacast("string",""), sigType, canonType); // Create signature and apply algorithms
</cfscript>
一切似乎都有效,直到它到达尝试创建签名对象的最后一行代码。以下是来自ColdFusion的失败消息:
Unable to find a constructor for class org.apache.xml.security.signature.XMLSignature that accepts parameters of type ( org.apache.xerces.dom.DeferredDocumentImpl, java.lang.String, java.lang.String, java.lang.String ).
我浏览了XMLSignature.java的源代码,最接近的匹配构造函数是:
public XMLSignature(
Document doc,
String baseURI,
String signatureMethodURI,
String canonicalizationMethodURI
) throws XMLSecurityException {
this(doc, baseURI, signatureMethodURI, 0, canonicalizationMethodURI);
}
继续查看XMLSignature.java,第一个参数是Document,看起来应该是“org.w3c.dom.Document”。
我怀疑问题是第一个参数的类型(变量“samlAssertionDocument”)的类型为“org.apache.xerces.dom.DeferredDocumentImpl”,而Java无法将强制转换为“org” .w3c.dom.Document”。
我尝试过javacast(),它似乎只适用于标准类型。
有没有办法轻松地将此变量转换为构造函数所期望的类型?如果有其他问题,请告诉我。
我在两个不同的博客上看到过类似的SAML 2.0示例,但它们来自2009/2010年并使用ColdFusion MX / 8。
我正在使用Apache Santuario项目(Apache XML Security for Java 1.5.8)。 1.5.8版包含易于使用的JAR文件。我在测试站点上设置了一个文件夹,并使用Application.cfc的“this.javaSettings”功能连接到它们。
我会使用较新的2.0.5版本,但似乎只有源格式。也就是说,我必须弄清楚如何创建JAR文件。