Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(SQL Server) Create AuthNRequest with embedded signature (HTTP-POST binding)Demonstrates how to create a SAML AuthNRequest with embedded signature (HTTP-POST binding).
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls. -- CREATE PROCEDURE ChilkatSample AS BEGIN DECLARE @hr int -- Important: Do not use nvarchar(max). See the warning about using nvarchar(max). DECLARE @sTmp0 nvarchar(4000) -- This example requires the Chilkat API to have been previously unlocked. -- See Global Unlock Sample for sample code. -- This example will sign the following SAML AuthNRequest: -- <samlp:AuthnRequest -- xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" -- xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" -- ID="pfx41d8ef22-e612-8c50-9960-1b16f15741b3" -- Version="2.0" ProviderName="SP test" IssueInstant="2014-07-16T23:52:45Z" -- Destination="http://idp.example.com/SSOService.php" -- ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" -- AssertionConsumerServiceURL="http://sp.example.com/demo1/index.php?acs"> -- <saml:Issuer>http://sp.example.com/demo1/metadata.php</saml:Issuer> -- <samlp:NameIDPolicy Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" AllowCreate="true"/> -- <samlp:RequestedAuthnContext Comparison="exact"> -- <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef> -- </samlp:RequestedAuthnContext> -- </samlp:AuthnRequest> -- First we build the XML to be signed. -- -- Use this online tool to generate the code from sample XML: -- Generate Code to Create XML DECLARE @success int SELECT @success = 1 DECLARE @xmlToSign int -- Use "Chilkat_9_5_0.Xml" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.Xml', @xmlToSign OUT IF @hr <> 0 BEGIN PRINT 'Failed to create ActiveX component' RETURN END EXEC sp_OASetProperty @xmlToSign, 'Tag', 'samlp:AuthnRequest' EXEC sp_OAMethod @xmlToSign, 'AddAttribute', @success OUT, 'xmlns:samlp', 'urn:oasis:names:tc:SAML:2.0:protocol' EXEC sp_OAMethod @xmlToSign, 'AddAttribute', @success OUT, 'xmlns:saml', 'urn:oasis:names:tc:SAML:2.0:assertion' EXEC sp_OAMethod @xmlToSign, 'AddAttribute', @success OUT, 'ID', 'pfx41d8ef22-e612-8c50-9960-1b16f15741b3' EXEC sp_OAMethod @xmlToSign, 'AddAttribute', @success OUT, 'Version', '2.0' EXEC sp_OAMethod @xmlToSign, 'AddAttribute', @success OUT, 'ProviderName', 'SP test' EXEC sp_OAMethod @xmlToSign, 'AddAttribute', @success OUT, 'IssueInstant', '2014-07-16T23:52:45Z' EXEC sp_OAMethod @xmlToSign, 'AddAttribute', @success OUT, 'Destination', 'http://idp.example.com/SSOService.php' EXEC sp_OAMethod @xmlToSign, 'AddAttribute', @success OUT, 'ProtocolBinding', 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST' EXEC sp_OAMethod @xmlToSign, 'AddAttribute', @success OUT, 'AssertionConsumerServiceURL', 'http://sp.example.com/demo1/index.php?acs' EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'saml:Issuer', 'http://sp.example.com/demo1/metadata.php' EXEC sp_OAMethod @xmlToSign, 'UpdateAttrAt', @success OUT, 'samlp:NameIDPolicy', 1, 'Format', 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress' EXEC sp_OAMethod @xmlToSign, 'UpdateAttrAt', @success OUT, 'samlp:NameIDPolicy', 1, 'AllowCreate', 'true' EXEC sp_OAMethod @xmlToSign, 'UpdateAttrAt', @success OUT, 'samlp:RequestedAuthnContext', 1, 'Comparison', 'exact' EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'samlp:RequestedAuthnContext|saml:AuthnContextClassRef', 'urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport' -- Also see the online tool to generate the code from sample already-signed XML: -- Generate XML Signature Creation Code from an Already-Signed XML Sample DECLARE @gen int -- Use "Chilkat_9_5_0.XmlDSigGen" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.XmlDSigGen', @gen OUT EXEC sp_OASetProperty @gen, 'SigLocation', 'samlp:AuthnRequest' EXEC sp_OASetProperty @gen, 'SigNamespacePrefix', 'ds' EXEC sp_OASetProperty @gen, 'SigNamespaceUri', 'http://www.w3.org/2000/09/xmldsig#' EXEC sp_OASetProperty @gen, 'SignedInfoCanonAlg', 'EXCL_C14N' EXEC sp_OASetProperty @gen, 'SignedInfoDigestMethod', 'sha1' -- -------- Reference 1 -------- EXEC sp_OAMethod @gen, 'AddSameDocRef', @success OUT, 'pfx41d8ef22-e612-8c50-9960-1b16f15741b3', 'sha1', 'EXCL_C14N', '', '' -- Provide a certificate + private key. (PFX password is test123) DECLARE @cert int -- Use "Chilkat_9_5_0.Cert" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.Cert', @cert OUT EXEC sp_OAMethod @cert, 'LoadPfxFile', @success OUT, 'qa_data/pfx/cert_test123.pfx', 'test123' IF @success <> 1 BEGIN EXEC sp_OAGetProperty @cert, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @xmlToSign EXEC @hr = sp_OADestroy @gen EXEC @hr = sp_OADestroy @cert RETURN END EXEC sp_OAMethod @gen, 'SetX509Cert', @success OUT, @cert, 1 EXEC sp_OASetProperty @gen, 'KeyInfoType', 'X509Data' EXEC sp_OASetProperty @gen, 'X509Type', 'Certificate' -- Load XML to be signed... DECLARE @sbXml int -- Use "Chilkat_9_5_0.StringBuilder" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @sbXml OUT EXEC sp_OAMethod @xmlToSign, 'GetXmlSb', @success OUT, @sbXml EXEC sp_OASetProperty @gen, 'Behaviors', 'IndentedSignature,ForceAddEnvelopedSignatureTransform' -- Sign the XML... EXEC sp_OAMethod @gen, 'CreateXmlDSigSb', @success OUT, @sbXml IF @success <> 1 BEGIN EXEC sp_OAGetProperty @gen, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @xmlToSign EXEC @hr = sp_OADestroy @gen EXEC @hr = sp_OADestroy @cert EXEC @hr = sp_OADestroy @sbXml RETURN END -- Save the signed XMl to a file. EXEC sp_OAMethod @sbXml, 'WriteFile', @success OUT, 'qa_output/signedXml.xml', 'utf-8', 0 -- A sample of the signed XML is shown below.. EXEC sp_OAMethod @sbXml, 'GetAsString', @sTmp0 OUT PRINT @sTmp0 -- ---------------------------------------- -- Verify the signature we just produced... DECLARE @verifier int -- Use "Chilkat_9_5_0.XmlDSig" for versions of Chilkat < 10.0.0 EXEC @hr = sp_OACreate 'Chilkat.XmlDSig', @verifier OUT EXEC sp_OAMethod @verifier, 'LoadSignatureSb', @success OUT, @sbXml IF @success <> 1 BEGIN EXEC sp_OAGetProperty @verifier, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @xmlToSign EXEC @hr = sp_OADestroy @gen EXEC @hr = sp_OADestroy @cert EXEC @hr = sp_OADestroy @sbXml EXEC @hr = sp_OADestroy @verifier RETURN END DECLARE @verified int EXEC sp_OAMethod @verifier, 'VerifySignature', @verified OUT, 1 IF @verified <> 1 BEGIN EXEC sp_OAGetProperty @verifier, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @xmlToSign EXEC @hr = sp_OADestroy @gen EXEC @hr = sp_OADestroy @cert EXEC @hr = sp_OADestroy @sbXml EXEC @hr = sp_OADestroy @verifier RETURN END PRINT 'This signature was successfully verified.' -- ----------------------------------------- -- Sample output of AuthNRequest signed XML: -- (Line-breaks and some indenting added for readability..) -- <?xml version="1.0" encoding="utf-8"?> -- <samlp:AuthnRequest -- xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" -- xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" -- ID="pfx41d8ef22-e612-8c50-9960-1b16f15741b3" -- Version="2.0" ProviderName="SP test" -- IssueInstant="2014-07-16T23:52:45Z" -- Destination="http://idp.example.com/SSOService.php" -- ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" -- AssertionConsumerServiceURL="http://sp.example.com/demo1/index.php?acs"> -- <saml:Issuer>http://sp.example.com/demo1/metadata.php</saml:Issuer> -- <samlp:NameIDPolicy Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" AllowCreate="true"/> -- <samlp:RequestedAuthnContext Comparison="exact"> -- <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef> -- </samlp:RequestedAuthnContext> -- <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> -- <ds:SignedInfo> -- <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> -- <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> -- <ds:Reference URI="#pfx41d8ef22-e612-8c50-9960-1b16f15741b3"> -- <ds:Transforms> -- <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> -- <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> -- </ds:Transforms> -- <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> -- <ds:DigestValue>5d+/YNShy4qnvZcvik8fHHg2SWQ=</ds:DigestValue> -- </ds:Reference> -- </ds:SignedInfo> -- <ds:SignatureValue>QS16H5...U5LQ==</ds:SignatureValue> -- <ds:KeyInfo> -- <ds:X509Data> -- <ds:X509Certificate>MIIF...tjlF4=</ds:X509Certificate> -- </ds:X509Data> -- </ds:KeyInfo> -- </ds:Signature> -- </samlp:AuthnRequest> -- EXEC @hr = sp_OADestroy @xmlToSign EXEC @hr = sp_OADestroy @gen EXEC @hr = sp_OADestroy @cert EXEC @hr = sp_OADestroy @sbXml EXEC @hr = sp_OADestroy @verifier END GO |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.