Exemple #1
0
 internal TransportSecurityProtocolFactory(TransportSecurityProtocolFactory factory) : base(factory)
 {
 }
Exemple #2
0
        protected virtual void VerifyIncomingMessageCore(ref Message message, TimeSpan timeout)
        {
            TransportSecurityProtocolFactory factory = (TransportSecurityProtocolFactory)SecurityProtocolFactory;
            string actor = string.Empty; // message.Version.Envelope.UltimateDestinationActor;

            ReceiveSecurityHeader securityHeader = factory.StandardsManager.TryCreateReceiveSecurityHeader(message, actor,
                                                                                                           factory.IncomingAlgorithmSuite, (factory.ActAsInitiator) ? MessageDirection.Output : MessageDirection.Input);
            IList <SupportingTokenAuthenticatorSpecification> supportingAuthenticators = factory.GetSupportingTokenAuthenticators(message.Headers.Action,
                                                                                                                                  out bool expectSignedTokens, out bool expectBasicTokens, out bool expectEndorsingTokens);

            if (securityHeader == null)
            {
                bool expectSupportingTokens = expectEndorsingTokens || expectSignedTokens || expectBasicTokens;
                if ((factory.ActAsInitiator && (!factory.AddTimestamp || factory.SecurityBindingElement.EnableUnsecuredResponse)) ||
                    (!factory.ActAsInitiator && !factory.AddTimestamp && !expectSupportingTokens))
                {
                    return;
                }
                else
                {
                    if (string.IsNullOrEmpty(actor))
                    {
                        throw Diagnostics.TraceUtility.ThrowHelperError(new MessageSecurityException(
                                                                            SR.Format(SR.UnableToFindSecurityHeaderInMessageNoActor)), message);
                    }
                    else
                    {
                        throw Diagnostics.TraceUtility.ThrowHelperError(new MessageSecurityException(
                                                                            SR.Format(SR.UnableToFindSecurityHeaderInMessage, actor)), message);
                    }
                }
            }

            securityHeader.RequireMessageProtection = false;
            securityHeader.ExpectBasicTokens        = expectBasicTokens;
            securityHeader.ExpectSignedTokens       = expectSignedTokens;
            securityHeader.ExpectEndorsingTokens    = expectEndorsingTokens;
            securityHeader.MaxReceivedMessageSize   = factory.SecurityBindingElement.MaxReceivedMessageSize;
            securityHeader.ReaderQuotas             = factory.SecurityBindingElement.ReaderQuotas;

            // Due to compatibility, only honor this setting if this app setting is enabled
            if (ServiceModelAppSettings.UseConfiguredTransportSecurityHeaderLayout)
            {
                securityHeader.Layout = factory.SecurityHeaderLayout;
            }

            TimeoutHelper timeoutHelper = new TimeoutHelper(timeout);

            if (!factory.ActAsInitiator)
            {
                securityHeader.ConfigureTransportBindingServerReceiveHeader(supportingAuthenticators);
                securityHeader.ConfigureOutOfBandTokenResolver(MergeOutOfBandResolvers(supportingAuthenticators, EmptyReadOnlyCollection <SecurityTokenResolver> .Instance));
                if (factory.ExpectKeyDerivation)
                {
                    securityHeader.DerivedTokenAuthenticator = factory.DerivedKeyTokenAuthenticator;
                }
            }
            securityHeader.ReplayDetectionEnabled = factory.DetectReplays;
            securityHeader.SetTimeParameters(factory.NonceCache, factory.ReplayWindow, factory.MaxClockSkew);
            securityHeader.Process(timeoutHelper.RemainingTime(), SecurityUtils.GetChannelBindingFromMessage(message), factory.ExtendedProtectionPolicy);
            message = securityHeader.ProcessedMessage;
            if (!factory.ActAsInitiator)
            {
                AttachRecipientSecurityProperty(message, securityHeader.BasicSupportingTokens, securityHeader.EndorsingSupportingTokens, securityHeader.SignedEndorsingSupportingTokens,
                                                securityHeader.SignedSupportingTokens, securityHeader.SecurityTokenAuthorizationPoliciesMapping);
            }

            base.OnIncomingMessageVerified(message);
        }
Exemple #3
0
 public TransportSecurityProtocol(TransportSecurityProtocolFactory factory, EndpointAddress target, Uri via) : base(factory, target, via)
 {
 }
Exemple #4
0
        protected virtual async ValueTask <Message> VerifyIncomingMessageCoreAsync(Message message, TimeSpan timeout)
        {
            TransportSecurityProtocolFactory factory = (TransportSecurityProtocolFactory)SecurityProtocolFactory;
            string actor = string.Empty; // message.Version.Envelope.UltimateDestinationActor;

            ReceiveSecurityHeader securityHeader = factory.StandardsManager.TryCreateReceiveSecurityHeader(message, actor,
                                                                                                           factory.IncomingAlgorithmSuite, (factory.ActAsInitiator) ? MessageDirection.Output : MessageDirection.Input);
            IList <SupportingTokenAuthenticatorSpecification> supportingAuthenticators = factory.GetSupportingTokenAuthenticators(message.Headers.Action,
                                                                                                                                  out bool expectSignedTokens, out bool expectBasicTokens, out bool expectEndorsingTokens);

            if (securityHeader == null)
            {
                bool expectSupportingTokens = expectEndorsingTokens || expectSignedTokens || expectBasicTokens;
                if ((factory.ActAsInitiator && (!factory.AddTimestamp || factory.SecurityBindingElement.EnableUnsecuredResponse)) ||
                    (!factory.ActAsInitiator && !factory.AddTimestamp && !expectSupportingTokens))
                {
                    return(message);
                }
                else
                {
                    if (string.IsNullOrEmpty(actor))
                    {
                        throw Diagnostics.TraceUtility.ThrowHelperError(new MessageSecurityException(
                                                                            SR.Format(SR.UnableToFindSecurityHeaderInMessageNoActor)), message);
                    }
                    else
                    {
                        throw Diagnostics.TraceUtility.ThrowHelperError(new MessageSecurityException(
                                                                            SR.Format(SR.UnableToFindSecurityHeaderInMessage, actor)), message);
                    }
                }
            }

            securityHeader.RequireMessageProtection = false;
            securityHeader.ExpectBasicTokens        = expectBasicTokens;
            securityHeader.ExpectSignedTokens       = expectSignedTokens;
            securityHeader.ExpectEndorsingTokens    = expectEndorsingTokens;
            securityHeader.MaxReceivedMessageSize   = factory.SecurityBindingElement.MaxReceivedMessageSize;
            securityHeader.ReaderQuotas             = factory.SecurityBindingElement.ReaderQuotas;

            // This was behind an app setting on WCF. If this breaks someone, it's because they are setting SecurityHeaderLayout and it
            // wasn't being applied. The customer fix is to not set the SecurityHeaderLayout as that's what they were effectively running with.
            securityHeader.Layout = factory.SecurityHeaderLayout;

            TimeoutHelper timeoutHelper = new TimeoutHelper(timeout);

            if (!factory.ActAsInitiator)
            {
                securityHeader.ConfigureTransportBindingServerReceiveHeader(supportingAuthenticators);
                securityHeader.ConfigureOutOfBandTokenResolver(MergeOutOfBandResolvers(supportingAuthenticators, EmptyReadOnlyCollection <SecurityTokenResolver> .Instance));
                if (factory.ExpectKeyDerivation)
                {
                    securityHeader.DerivedTokenAuthenticator = factory.DerivedKeyTokenAuthenticator;
                }
            }
            securityHeader.ReplayDetectionEnabled = factory.DetectReplays;
            securityHeader.SetTimeParameters(factory.NonceCache, factory.ReplayWindow, factory.MaxClockSkew);
            await securityHeader.ProcessAsync(timeoutHelper.RemainingTime(), SecurityUtils.GetChannelBindingFromMessage(message), factory.ExtendedProtectionPolicy);

            Message processedMessage = securityHeader.ProcessedMessage;

            if (!factory.ActAsInitiator)
            {
                AttachRecipientSecurityProperty(processedMessage, securityHeader.BasicSupportingTokens, securityHeader.EndorsingSupportingTokens, securityHeader.SignedEndorsingSupportingTokens,
                                                securityHeader.SignedSupportingTokens, securityHeader.SecurityTokenAuthorizationPoliciesMapping);
            }

            base.OnIncomingMessageVerified(processedMessage);

            return(processedMessage);
        }