CheckValid() public méthode

Verifies the assertion's signature and its time to live.
if the assertion's signature can not be verified or its time to live has been exceeded.
public CheckValid ( IEnumerable trustedSigners ) : void
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;
        }
Exemple #5
0
        [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");                                                                                                                                                                          ;
			}
		}