public async Task ParseResponse_failed_2_nested_status_code_Test() { //ARRANGE var inResponseTo = Guid.NewGuid().ToString(); var response = ResponseFactoryMock.GetTokenResponse(inResponseTo, StatusCodes.Responder); ResponseFactoryMock.GetStatusCode(StatusCodes.NoAuthnContext, response.Status.StatusCode); ResponseFactoryMock.GetStatusCode(StatusCodes.InvalidNameIdPolicy, response.Status.StatusCode.SubStatusCode); response.Status.StatusMessage = "Test message"; var logger = new LogProviderMock(); var serialised = ResponseFactoryMock.Serialize(response); var parser = new SamlTokenResponseParser(logger); //ACT var tokenResponse = await parser.Parse(serialised); //ASSERT Assert.AreEqual(StatusCodes.Responder, tokenResponse.Status.StatusCode.Value); Assert.IsNotNull(tokenResponse.Status.StatusCode.SubStatusCode); Assert.AreEqual(StatusCodes.NoAuthnContext, tokenResponse.Status.StatusCode.SubStatusCode.Value); Assert.IsNotNull(tokenResponse.Status.StatusCode.SubStatusCode.SubStatusCode); Assert.AreEqual(StatusCodes.InvalidNameIdPolicy, tokenResponse.Status.StatusCode.SubStatusCode.SubStatusCode.Value); Assert.IsNull(tokenResponse.Status.StatusCode.SubStatusCode.SubStatusCode.SubStatusCode); Assert.AreEqual("Test message", tokenResponse.Status.StatusMessage); Assert.IsNull(tokenResponse.Status.StatusDetail); }
public async Task ParseResponse_success_Test() { //ARRANGE var inResponseTo = "Test_" + Guid.NewGuid().ToString(); var response = ResponseFactoryMock.GetTokenResponseSuccess(inResponseTo, StatusCodes.Success); var logger = new LogProviderMock(); var serialised = ResponseFactoryMock.Serialize(response); var parser = new SamlTokenResponseParser(logger); //ACT var tokenResponse = await parser.Parse(serialised); //ASSERT Assert.AreEqual(StatusCodes.Success, tokenResponse.Status.StatusCode.Value); Assert.IsNull(tokenResponse.Status.StatusCode.SubStatusCode); Assert.IsNull(tokenResponse.Status.StatusMessage); Assert.IsNull(tokenResponse.Status.StatusDetail); Assert.AreEqual(inResponseTo, tokenResponse.InResponseTo); Assert.AreEqual(response.ID, tokenResponse.ID); Assert.AreEqual(response.IssueInstant, tokenResponse.IssueInstant); Assert.AreEqual(response.Issuer.Format, tokenResponse.Issuer.Format); Assert.AreEqual(response.Issuer.Value, tokenResponse.Issuer.Value); Assert.AreEqual(response.Version, tokenResponse.Version); Assert.AreEqual(response.Destination, tokenResponse.Destination); }
public async Task ParseResponse_failed_nested_status_code_with_details_Test() { //ARRANGE var inResponseTo = Guid.NewGuid().ToString(); var response = ResponseFactoryMock.GetTokenResponse(inResponseTo, StatusCodes.Responder); ResponseFactoryMock.GetStatusCode(StatusCodes.NoAuthnContext, response.Status.StatusCode); response.Status.StatusMessage = "Test message"; var doc = new XmlDocument(); //doc.PreserveWhitespace = true; var el = doc.CreateElement("DetailElement"); el.SetAttribute("MessageId", "Status details"); var el1 = doc.CreateElement("AditionalDetailElement"); el1.SetAttribute("AdditionalDetail", "Additional details"); ResponseFactoryMock.BuildStatuseDetail(response.Status, new[] { el, el1 }); var logger = new LogProviderMock(); var serialised = ResponseFactoryMock.Serialize(response); var parser = new SamlTokenResponseParser(logger); //ACT var tokenResponse = await parser.Parse(serialised); //ASSERT Assert.AreEqual(StatusCodes.Responder, tokenResponse.Status.StatusCode.Value); Assert.IsNotNull(tokenResponse.Status.StatusCode.SubStatusCode); Assert.AreEqual(StatusCodes.NoAuthnContext, tokenResponse.Status.StatusCode.SubStatusCode.Value); Assert.IsNull(tokenResponse.Status.StatusCode.SubStatusCode.SubStatusCode); Assert.AreEqual("Test message", tokenResponse.Status.StatusMessage); Assert.IsNotNull(tokenResponse.Status.StatusDetail); Assert.AreEqual(2, tokenResponse.Status.StatusDetail.Any.Length); }
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 void SignResponse_namespace_not_included() { //ARRANGE var signatureManager = new XmlSignatureManager(); var inResponseTo = "Test_" + Guid.NewGuid(); var tokenResponse = ResponseFactoryMock.GetTokenResponseSuccess(inResponseTo); var cert = CertificateProviderMock.GetMockCertificate(); var serialised = ResponseFactoryMock.Serialize(tokenResponse); var document = new XmlDocument(); document.LoadXml(serialised); //ACT signatureManager.WriteSignature(document, tokenResponse.ID, cert.PrivateKey, String.Empty, String.Empty); var isValid = signatureManager.VerifySignature(document, cert.PublicKey.Key); //ASSERT Assert.True(isValid); }
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]); }