Exemple #1
0
        private static XmlElement ResolveArtifact(
            string artifact,
            StoredRequestState storedRequestState,
            IOptions options)
        {
            var binaryArtifact = Convert.FromBase64String(artifact);
            var idp            = GetIdp(binaryArtifact, storedRequestState, options);
            var arsIndex       = (binaryArtifact[2] << 8) | binaryArtifact[3];
            var arsUri         = idp.ArtifactResolutionServiceUrls[arsIndex];

            var payload = new Saml2ArtifactResolve
            {
                Artifact = artifact,
                Issuer   = options.SPOptions.EntityId
            }.ToXml();

            var signingServiceCertificate = options.SPOptions.SigningServiceCertificate;
            var resolver = options.SPOptions.ArtifactResolver;

            options.SPOptions.Logger.WriteVerbose("Calling idp " + idp.EntityId.Id + " to resolve artifact\n" + artifact);

            var response =
                Saml2SoapBinding.SendSoapRequest(payload, arsUri, signingServiceCertificate, resolver);

            options.SPOptions.Logger.WriteVerbose("Artifact resolved returned\n" + response);

            return(new Saml2ArtifactResponse(response).GetMessage());
        }
Exemple #2
0
        private static XmlElement ResolveArtifact(
            string artifact,
            string relayState,
            IOptions options)
        {
            var binaryArtifact = Convert.FromBase64String(artifact);
            var idp            = GetIdp(binaryArtifact, relayState, options);
            var arsIndex       = (binaryArtifact[2] << 8) | binaryArtifact[3];
            var arsUri         = idp.ArtifactResolutionServiceUrls[arsIndex];

            var payload = new Saml2ArtifactResolve()
            {
                Artifact = artifact,
                Issuer   = options.SPOptions.EntityId
            }.ToXml();

            if (options.SPOptions.SigningServiceCertificate != null)
            {
                var xmlDoc = new XmlDocument()
                {
                    PreserveWhitespace = true
                };

                xmlDoc.LoadXml(payload);
                xmlDoc.Sign(options.SPOptions.SigningServiceCertificate, true);
                payload = xmlDoc.OuterXml;
            }

            var response = Saml2SoapBinding.SendSoapRequest(payload, arsUri);

            return(new Saml2ArtifactResponse(response).Message);
        }
        private static XmlElement ResolveArtifact(
            string artifact,
            StoredRequestState storedRequestState,
            IOptions options)
        {
            var binaryArtifact = Convert.FromBase64String(artifact);
            var idp            = GetIdp(binaryArtifact, storedRequestState, options);
            var arsIndex       = (binaryArtifact[2] << 8) | binaryArtifact[3];
            var arsUri         = idp.ArtifactResolutionServiceUrls[arsIndex];

            var payload = new Saml2ArtifactResolve()
            {
                Artifact = artifact,
                Issuer   = options.SPOptions.EntityId
            }.ToXml();

            if (options.SPOptions.SigningServiceCertificate != null)
            {
                var xmlDoc = XmlHelpers.XmlDocumentFromString(payload);
                xmlDoc.Sign(options.SPOptions.SigningServiceCertificate, true);
                payload = xmlDoc.OuterXml;
            }

            options.SPOptions.Logger.WriteVerbose("Calling idp " + idp.EntityId.Id + " to resolve artifact\n" + artifact);

            var clientCertificates = options.SPOptions.ServiceCertificates
                                     .Where(sc => sc.Use.HasFlag(CertificateUse.TlsClient) && sc.Status == CertificateStatus.Current)
                                     .Select(sc => sc.Certificate);

            var response = Saml2SoapBinding.SendSoapRequest(payload, arsUri, clientCertificates);

            options.SPOptions.Logger.WriteVerbose("Artifact resolved returned\n" + response);

            return(new Saml2ArtifactResponse(response).GetMessage());
        }
        public void Saml2SoapBinding_SendSoapRequest_NullCheckDestination()
        {
            string payload = "Doesn't matter";

            Action a = () => Saml2SoapBinding.SendSoapRequest(payload, null, null, null);

            a.ShouldThrow <ArgumentNullException>()
            .And.ParamName.Should().Be("destination");
        }
        public void Saml2SoapBinding_SendSoapRequest_AllowsHttps()
        {
            var payload     = "Doesn't matter";
            var destination = new Uri("https://localhost/Endpoint");

            Action a = () => Saml2SoapBinding.SendSoapRequest(payload, destination, null, null);

            // Destination is not listening, but we should get an exception that shows it
            // at least tried to connect there.
            a.ShouldThrow <WebException>();
        }
        public void Saml2SoapBinding_SendSoapRequest_VerifiesUriIsRemote()
        {
            File.Exists("c:\\Kentor-Unit-Test.txt").Should().BeFalse(
                "a file c:\\Kentor-Unit-Test.txt already exists, preventing test from running");

            var payload     = "Doesn't matter";
            var destination = new Uri("file://c:/Kentor-Unit-Test.txt");

            Action a = () => Saml2SoapBinding.SendSoapRequest(payload, destination, null, null);

            a.ShouldThrow <ArgumentException>()
            .WithMessage("*file*");
        }
        public void Saml2SoapBinding_CreateSoapBody()
        {
            var message = "<payload>data</payload>";

            var expected = XElement.Parse(
                @"<SOAP-ENV:Envelope
    xmlns:SOAP-ENV=""http://schemas.xmlsoap.org/soap/envelope/"">
    <SOAP-ENV:Body>
        <payload>data</payload>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>");

            var actual = XElement.Parse(Saml2SoapBinding.CreateSoapBody(message));

            actual.ShouldBeEquivalentTo(expected, opt => opt.IgnoringCyclicReferences());
        }
        public void Saml2SoapBinding_ExtractBody()
        {
            string payload =
                "    <payload>\n"
                + "      <color>\n"
                + "        red\n"
                + "      </color>\n"
                + "      <color>\n"
                + "        green\n"
                + "      </color>\n"
                + "    </payload>\n";

            string soapMessage =
                "<SOAP-ENV:Envelope\n"
                + "xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"
                + "  <SOAP-ENV:Body>\n"
                + payload
                + "  </SOAP-ENV:Body>\n"
                + "</SOAP-ENV:Envelope>";

            Saml2SoapBinding.ExtractBody(soapMessage)
            .OuterXml.Should().Be(payload.Trim());
        }