public CheckValid ( IEnumerable |
||
trustedSigners | IEnumerable |
|
Résultat | void |
/// <summary> /// Decrypts an assertion we received from "fælles-offentlige brugerstyring". /// </summary> private static void DecryptFOBSAssertion(string file) { string assertionBase64 = File.ReadAllText(file); byte[] assertionBytes = Convert.FromBase64String(assertionBase64); XmlDocument doc = new XmlDocument(); doc.PreserveWhitespace = true; doc.Load(new MemoryStream(assertionBytes)); XmlNodeList encryptedList = doc.GetElementsByTagName(EncryptedAssertion.ELEMENT_NAME, Saml20Constants.ASSERTION); Assert.That(encryptedList.Count == 1); // Do some mock configuration. FederationConfig config = FederationConfig.GetConfig(); config.AllowedAudienceUris.Audiences.Add("https://saml.safewhere.net"); SAML20FederationConfig descr = SAML20FederationConfig.GetConfig(); descr.Endpoints.MetadataLocation = @"Saml20\Protocol\MetadataDocs\FOBS"; // Set it manually. Assert.That(Directory.Exists(descr.Endpoints.MetadataLocation)); X509Certificate2 cert = new X509Certificate2(@"Saml20\Certificates\SafewhereTest_SFS.pfx", "test1234"); Saml20EncryptedAssertion encass = new Saml20EncryptedAssertion((RSA)cert.PrivateKey); encass.LoadXml((XmlElement)encryptedList[0]); encass.Decrypt(); // Retrieve metadata Saml20Assertion assertion = new Saml20Assertion(encass.Assertion.DocumentElement, null, false); IDPEndPoint endp = descr.FindEndPoint(assertion.Issuer); Assert.IsNotNull(endp, "Endpoint not found"); Assert.IsNotNull(endp.metadata, "Metadata not found"); try { assertion.CheckValid(AssertionUtil.GetTrustedSigners(assertion.Issuer)); Assert.Fail("Verification should fail. Token does not include its signing key."); } catch (InvalidOperationException) {} Assert.IsNull(assertion.SigningKey, "Signing key is already present on assertion. Modify test."); IEnumerable <string> validationFailures; Assert.That(assertion.CheckSignature(Saml20SignonHandler.GetTrustedSigners(endp.metadata.GetKeys(KeyTypes.signing), endp, out validationFailures))); Assert.IsNotNull(assertion.SigningKey, "Signing key was not set on assertion instance."); }
/// <summary> /// Decrypts an assertion we received from "fælles-offentlige brugerstyring". /// </summary> private static void DecryptFOBSAssertion(string file) { string assertionBase64 = File.ReadAllText(file); byte[] assertionBytes = Convert.FromBase64String(assertionBase64); XmlDocument doc = new XmlDocument(); doc.PreserveWhitespace = true; doc.Load( new MemoryStream(assertionBytes) ); XmlNodeList encryptedList = doc.GetElementsByTagName(EncryptedAssertion.ELEMENT_NAME, Saml20Constants.ASSERTION); Assert.That(encryptedList.Count == 1); // Do some mock configuration. FederationConfig config = FederationConfig.GetConfig(); config.AllowedAudienceUris.Audiences.Add("https://saml.safewhere.net"); SAML20FederationConfig descr = ConfigurationReader.GetConfig<SAML20FederationConfig>(); descr.Endpoints.metadataLocation = @"Saml20\Protocol\MetadataDocs\FOBS"; // Set it manually. Assert.That(Directory.Exists(descr.Endpoints.metadataLocation)); descr.Endpoints.Refresh(); X509Certificate2 cert = new X509Certificate2(@"Saml20\Certificates\SafewhereTest_SFS.pfx", "test1234"); Saml20EncryptedAssertion encass = new Saml20EncryptedAssertion((RSA) cert.PrivateKey); encass.LoadXml((XmlElement) encryptedList[0]); encass.Decrypt(); // Retrieve metadata Saml20Assertion assertion = new Saml20Assertion(encass.Assertion.DocumentElement, null, false); IDPEndPoint endp = descr.FindEndPoint(assertion.Issuer); Assert.IsNotNull(endp, "Endpoint not found"); Assert.IsNotNull(endp.metadata, "Metadata not found"); try { assertion.CheckValid(AssertionUtil.GetTrustedSigners(assertion.Issuer)); Assert.Fail("Verification should fail. Token does not include its signing key."); } catch(InvalidOperationException) {} Assert.IsNull(assertion.SigningKey, "Signing key is already present on assertion. Modify test."); Assert.That(assertion.CheckSignature(Saml20SignonHandler.GetTrustedSigners(endp.metadata.GetKeys(KeyTypes.signing), endp))); Assert.IsNotNull(assertion.SigningKey, "Signing key was not set on assertion instance."); }
public void AddAttribute_01() { Saml20Assertion assertion = LoadAssertion(@"Saml20\Assertions\Saml2Assertion_01"); List<SamlAttribute> attributes = assertion.Attributes; attributes.Add(DKSaml20PostalAddressAttribute.Create("DK-2200 København")); X509Certificate2 cert = AssertionUtil.GetCertificate1(); assertion.Sign(cert); assertion.CheckValid(new AsymmetricAlgorithm[] { cert.PublicKey.Key }); // Verify that the modified assertion can survive complete serialization and deserialization. string assertionString = assertion.GetXml().OuterXml; XmlDocument deserializedAssertionDoc = new XmlDocument(); deserializedAssertionDoc.PreserveWhitespace = true; deserializedAssertionDoc.Load(new StringReader(assertionString)); Saml20Assertion deserializedAssertion = new Saml20Assertion(deserializedAssertionDoc.DocumentElement, null, false); Assert.IsNotNull(deserializedAssertion.GetSignatureKeys(), "Signing keys must be present"); deserializedAssertion.CheckValid(new AsymmetricAlgorithm[] { cert.PublicKey.Key }); }
/// <summary> /// Loads an assertion, deserializes it using the <code>Assertion</code> class and returns the /// resulting <code>Assertion</code> instance. /// </summary> public static Saml20Assertion DeserializeToken(string assertionFile) { FileStream fs = File.OpenRead(assertionFile); XmlDocument document = new XmlDocument(); document.PreserveWhitespace = true; document.Load(fs); fs.Close(); Saml20Assertion assertion = new Saml20Assertion(document.DocumentElement, null, false); List<AsymmetricAlgorithm> result = new List<AsymmetricAlgorithm>(1); foreach (KeyInfoClause clause in assertion.GetSignatureKeys()) { AsymmetricAlgorithm key = XmlSignatureUtils.ExtractKey(clause); result.Add(key); } assertion.CheckValid(result); return assertion; }
[Ignore] // TODO: test data needs fixing public void TestSigning_03() { // Load an unsigned assertion. Saml20Assertion assertion = new Saml20Assertion(AssertionUtil.GetTestAssertion_01().DocumentElement, null, false); // Check that the assertion is not considered valid in any way. try { assertion.CheckValid(AssertionUtil.GetTrustedSigners(assertion.Issuer)); Assert.Fail("Unsigned assertion was passed off as valid."); } catch { //Added to make resharper happy Assert.That(true); } X509Certificate2 cert = new X509Certificate2(@"Saml20\Certificates\sts_dev_certificate.pfx", "test1234"); Assert.That(cert.HasPrivateKey, "Certificate no longer contains a private key. Modify test."); assertion.Sign(cert); // Check that the signature is now valid assertion.CheckValid(new AsymmetricAlgorithm[] {cert.PublicKey.Key}); WriteToFile(@"\signedassertion.xml", assertion.GetXml()); }
/// <summary> /// Raised when the SAML 2.0 response parameter has been detected. /// </summary> /// <param name="url">URL of the page.</param> /// <param name="query">The parsed query of the URL.</param> /// <param name="fragment">The parsed fragment of the URL.</param> /// <param name="formParams">Form parameters, including the 'SAMLResponse'.</param> protected override void OnRedirectPageLoaded (Uri url, System.Collections.Generic.IDictionary<string, string> query, System.Collections.Generic.IDictionary<string, string> fragment, IDictionary<string, string> formParams) { string base64SamlAssertion = formParams.ContainsKey ("SAMLResponse") ? formParams ["SAMLResponse"] : string.Empty; byte[] xmlSamlAssertionBytes = Convert.FromBase64String (base64SamlAssertion); string xmlSamlAssertion = System.Text.UTF8Encoding.Default.GetString (xmlSamlAssertionBytes); XmlDocument xDoc = new XmlDocument (); xDoc.PreserveWhitespace = true; xDoc.LoadXml (xmlSamlAssertion); XmlElement responseElement = (XmlElement)xDoc.SelectSingleNode ("//*[local-name()='Response']"); #if DEBUG Console.WriteLine ("{0}", responseElement.OuterXml); #endif XmlElement assertionElement = (XmlElement)xDoc.SelectSingleNode ("//*[local-name()='Assertion']"); if (assertionElement != null) { #if DEBUG Console.WriteLine ("{0}", assertionElement.OuterXml); #endif Saml20Assertion samlAssertion = new Saml20Assertion (assertionElement, null, AssertionProfile.Core, false, false); List<AsymmetricAlgorithm> trustedIssuers = new List<AsymmetricAlgorithm>(1); foreach (KeyDescriptor key in _idpMetadata.Keys) { System.Security.Cryptography.Xml.KeyInfo ki = (System.Security.Cryptography.Xml.KeyInfo) key.KeyInfo; foreach (KeyInfoClause clause in ki) { AsymmetricAlgorithm aa = XmlSignatureUtils.ExtractKey(clause); trustedIssuers.Add(aa); } } try { samlAssertion.CheckValid (trustedIssuers); SamlAccount sa = new SamlAccount (samlAssertion, responseElement); OnSucceeded (sa); } catch (Saml20Exception samlEx) { Console.WriteLine (samlEx); OnError (samlEx.Message); } catch (Exception ex) { Console.WriteLine (ex); OnError (ex.Message); } } else { OnError ("No SAML Assertion Found"); ; } }