Пример #1
0
        public async Task ParseTokenResponse_post_binding_sp_initiated()
        {
            //ARRANGE
            var inResponseTo = Guid.NewGuid().ToString();

            var response            = ResponseFactoryMock.GetTokenResponseSuccess(inResponseTo, StatusCodes.Success);
            var logger              = new LogProviderMock();
            var serialised          = ResponseFactoryMock.Serialize(response);
            var xmlSignatureManager = new XmlSignatureManager();
            var document            = new XmlDocument();

            document.LoadXml(serialised);
            var cert = AssertionFactroryMock.GetMockCertificate();

            xmlSignatureManager.SignXml(document, response.ID, cert.PrivateKey, null);
            var base64Encoded = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(document.DocumentElement.OuterXml));

            var compressor           = new DeflateCompressor();
            var encoder              = new MessageEncoding(compressor);
            var jsonSerialiser       = new NSJsonSerializer(new DefaultSettingsProvider());
            var relayStateSerialiser = new RelaystateSerialiser(jsonSerialiser, encoder, logger) as IRelayStateSerialiser;
            var relayState           = await relayStateSerialiser.Serialize(new Dictionary <string, object> {
                { "Key", "Value" }
            });

            var form = new SAMLForm();

            form.SetResponse(base64Encoded);
            form.SetRelatState(relayState);

            Func <Type, IMetadataHandler> metadataHandlerFactory = t => new MetadataEntitityDescriptorHandler();

            var certManager      = new CertificateManager(logger);
            var signatureManager = new XmlSignatureManager();
            Func <IEnumerable <ResponseValidationRule> > rulesResolver = () => new[] { new ResponseSignatureRule(logger, certManager, signatureManager) };
            var validator = new Federation.Protocols.Response.Validation.ResponseValidator(logger, new RuleFactory(rulesResolver));
            var configurationRetrieverMock        = new ConfigurationRetrieverMock();
            var federationPartyContextBuilderMock = new FederationPartyContextBuilderMock();
            var configurationManger = new ConfigurationManager <MetadataBase>(federationPartyContextBuilderMock, configurationRetrieverMock);
            var relayStateHandler   = new RelayStateHandler(relayStateSerialiser, logger);
            var responseParser      = new ResponseParser(metadataHandlerFactory, t => new SamlTokenResponseParser(logger),
                                                         configurationManger, relayStateHandler, logger, validator);
            var postBindingDecoder = new PostBindingDecoder(logger);
            var message            = await postBindingDecoder.Decode(form.HiddenControls.ToDictionary(k => k.Key, v => v.Value));

            var context = new SamlInboundContext
            {
                Message            = message,
                DescriptorResolver = m => metadataHandlerFactory(typeof(object)).GetIdentityProviderSingleSignOnDescriptor(m).Single().Roles.Single()
            };
            //ACT
            var result = await responseParser.Parse(context);

            //ASSERT
            Assert.IsTrue(result.IsValidated);
        }
        public async Task GetRelayStateFromFormDataTest()
        {
            //ARRANGE
            var relayState = new Dictionary <string, object> {
                { "relayState", "Test state" }
            };
            var form           = new Dictionary <string, string>();
            var compressor     = new DeflateCompressor();
            var messageEncoder = new MessageEncoding(compressor);
            var jsonSerialiser = new NSJsonSerializer(new DefaultSettingsProvider());
            var logger         = new LogProviderMock();
            var serialiser     = new RelaystateSerialiser(jsonSerialiser, messageEncoder, logger) as IRelayStateSerialiser;
            var handler        = new RelayStateHandler(serialiser, logger);
            //ACT
            var serialised = await serialiser.Serialize(relayState);

            form.Add("RelayState", serialised);
            var deserialised = await handler.GetRelayStateFromFormData(form) as Dictionary <string, object>;

            //ASSERT
            Assert.AreEqual(relayState.Count, deserialised.Count);
            Assert.AreEqual(relayState["relayState"], deserialised["relayState"]);
        }
        public async Task DecodeTest()
        {
            //ARRANGE
            var inResponseTo = Guid.NewGuid().ToString();

            var response         = ResponseFactoryMock.GetTokenResponseSuccess(inResponseTo, StatusCodes.Success);
            var logger           = new LogProviderMock();
            var serialised       = ResponseFactoryMock.Serialize(response);
            var responseToBase64 = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(serialised));
            var relayState       = new Dictionary <string, object> {
                { "relayState", "Test state" }
            };
            var compressor            = new DeflateCompressor();
            var messageEncoder        = new MessageEncoding(compressor);
            var jsonSerialiser        = new NSJsonSerializer(new DefaultSettingsProvider());
            var serialiser            = new RelaystateSerialiser(jsonSerialiser, messageEncoder, logger) as IRelayStateSerialiser;
            var serialisedRelaySatate = await serialiser.Serialize(relayState);

            var relayStateHandler = new RelayStateHandler(serialiser, logger);
            var form = new Dictionary <string, string>
            {
                { HttpRedirectBindingConstants.SamlResponse, responseToBase64 },
                { HttpRedirectBindingConstants.RelayState, serialisedRelaySatate }
            };

            var decoder = new PostBindingDecoder(logger);
            //ACT
            var message = await decoder.Decode(form);

            var stateFromResult = message.Elements[HttpRedirectBindingConstants.RelayState];

            //ASSERT
            Assert.IsNotNull(stateFromResult);
            Assert.AreEqual(serialised, message.Elements[HttpRedirectBindingConstants.SamlResponse]);
            Assert.AreEqual(serialisedRelaySatate, message.Elements[HttpRedirectBindingConstants.RelayState]);
        }