< Summary - CoreWCF Coverage — PR #1766

Information
Class: CoreWCF.Security.SecuritySessionSecurityTokenAuthenticator
Assembly: CoreWCF.Primitives
File(s): /home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/Security/SecuritySessionSecurityTokenAuthenticator.cs
Line coverage
63%
Covered lines: 323
Uncovered lines: 187
Coverable lines: 510
Total lines: 1319
Line coverage: 63.3%
Branch coverage
46%
Covered branches: 111
Total branches: 240
Branch coverage: 46.2%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

/home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/Security/SecuritySessionSecurityTokenAuthenticator.cs

#LineLine coverage
 1// Licensed to the .NET Foundation under one or more agreements.
 2// The .NET Foundation licenses this file to you under the MIT license.
 3
 4using System;
 5using System.Collections.Generic;
 6using System.Collections.ObjectModel;
 7using System.Globalization;
 8using System.Runtime.Serialization;
 9using System.Threading;
 10using System.Threading.Tasks;
 11using System.Xml;
 12using CoreWCF.Channels;
 13using CoreWCF.Description;
 14using CoreWCF.Diagnostics;
 15using CoreWCF.Dispatcher;
 16using CoreWCF.IdentityModel.Claims;
 17using CoreWCF.IdentityModel.Policy;
 18using CoreWCF.IdentityModel.Selectors;
 19using CoreWCF.IdentityModel.Tokens;
 20using CoreWCF.Runtime;
 21using CoreWCF.Security.Tokens;
 22
 23namespace CoreWCF.Security
 24{
 25    internal class SecuritySessionSecurityTokenAuthenticator : CommunicationObjectSecurityTokenAuthenticator, IIssuanceS
 26    {
 327        internal static readonly TimeSpan s_defaultSessionTokenLifetime = TimeSpan.MaxValue;
 28        internal const int DefaultMaxCachedSessionTokens = int.MaxValue;
 329        internal static readonly SecurityStandardsManager s_defaultStandardsManager = SecurityStandardsManager.DefaultIn
 30        private bool _isClientAnonymous;
 31        private TimeSpan _sessionTokenLifetime;
 32        private ISecurityContextSecurityTokenCache _issuedTokenCache;
 33        private SecurityBindingElement _bootstrapSecurityBindingElement;
 34        private BindingContext _issuerBindingContext;
 35        private SecurityStandardsManager _standardsManager;
 36        private SecurityAlgorithmSuite _securityAlgorithmSuite;
 37        private SecurityKeyEntropyMode _keyEntropyMode;
 38        private TimeSpan _keyRenewalInterval;
 39        private SecurityTokenParameters _issuedTokenParameters;
 40        private Uri _listenUri;
 41        private string _sctUri;
 42        private IMessageFilterTable<EndpointAddress> _endpointFilterTable;
 43        private bool _shouldMatchRstWithEndpointFilter;
 44        private int _maximumConcurrentNegotiations;
 45        private TimeSpan _negotiationTimeout;
 2246        private readonly object _thisLock = new object();
 47
 2248        public SecuritySessionSecurityTokenAuthenticator()
 49        {
 2250            SessionTokenAuthenticator = new SecurityContextSecurityTokenAuthenticator();
 2251            _sessionTokenLifetime = s_defaultSessionTokenLifetime;
 2252            _isClientAnonymous = false;
 2253            _standardsManager = s_defaultStandardsManager;
 2254            _keyEntropyMode = SecurityKeyEntropyMode.CombinedEntropy;// AcceleratedTokenProvider.defaultKeyEntropyMode;
 2255            _maximumConcurrentNegotiations = 128;// AcceleratedTokenAuthenticator.defaultServerMaxActiveNegotiations;
 2256            _negotiationTimeout = TimeSpan.Parse("00:01:00", CultureInfo.InvariantCulture); // AcceleratedTokenAuthentic
 2257        }
 58
 4259        public IssuedSecurityTokenHandler IssuedSecurityTokenHandler { get; set; }
 60
 2261        public RenewedSecurityTokenHandler RenewedSecurityTokenHandler { get; set; }
 62
 6663        public SecurityServiceDispatcher SecurityServiceDispatcher { get; set; }
 64
 65        public SecurityAlgorithmSuite SecurityAlgorithmSuite
 66        {
 67            get
 68            {
 3269                return _securityAlgorithmSuite;
 70            }
 71            set
 72            {
 2273                CommunicationObject.ThrowIfDisposedOrImmutable();
 2274                _securityAlgorithmSuite = value;
 2275            }
 76        }
 77
 78        public SecurityKeyEntropyMode KeyEntropyMode
 79        {
 80            get
 81            {
 1082                return _keyEntropyMode;
 83            }
 84            set
 85            {
 2286                CommunicationObject.ThrowIfDisposedOrImmutable();
 2287                SecurityKeyEntropyModeHelper.Validate(value);
 2288                _keyEntropyMode = value;
 2289            }
 90        }
 91
 92        public bool IsClientAnonymous
 93        {
 94            get
 95            {
 096                return _isClientAnonymous;
 97            }
 98            set
 99            {
 0100                CommunicationObject.ThrowIfDisposedOrImmutable();
 0101                _isClientAnonymous = value;
 0102            }
 103        }
 104
 105        public TimeSpan SessionTokenLifetime
 106        {
 107            get
 108            {
 0109                return _sessionTokenLifetime;
 110            }
 111            set
 112            {
 22113                CommunicationObject.ThrowIfDisposedOrImmutable();
 22114                if (value <= TimeSpan.Zero)
 115                {
 0116                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException(nameof(val
 117                }
 118
 22119                if (TimeoutHelper.IsTooLarge(value))
 120                {
 0121                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException(nameof(val
 0122                        SRCommon.SFxTimeoutOutOfRangeTooBig));
 123                }
 22124                _sessionTokenLifetime = value;
 22125            }
 126        }
 127
 128        public TimeSpan KeyRenewalInterval
 129        {
 130            get
 131            {
 0132                return _keyRenewalInterval;
 133            }
 134            set
 135            {
 22136                CommunicationObject.ThrowIfDisposedOrImmutable();
 22137                if (value <= TimeSpan.Zero)
 138                {
 0139                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException(nameof(val
 140                }
 141
 22142                if (TimeoutHelper.IsTooLarge(value))
 143                {
 0144                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException(nameof(val
 0145                        SRCommon.SFxTimeoutOutOfRangeTooBig));
 146                }
 22147                _keyRenewalInterval = value;
 22148            }
 149        }
 150
 151        public int MaximumConcurrentNegotiations
 152        {
 153            get
 154            {
 0155                return _maximumConcurrentNegotiations;
 156            }
 157            set
 158            {
 22159                CommunicationObject.ThrowIfDisposedOrImmutable();
 22160                if (value < 0)
 161                {
 0162                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException(nameof(val
 163                }
 22164                _maximumConcurrentNegotiations = value;
 22165            }
 166        }
 167
 168        public TimeSpan NegotiationTimeout
 169        {
 170            get
 171            {
 22172                return _negotiationTimeout;
 173            }
 174            set
 175            {
 22176                CommunicationObject.ThrowIfDisposedOrImmutable();
 22177                if (value <= TimeSpan.Zero)
 178                {
 0179                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException(nameof(val
 180                }
 22181                _negotiationTimeout = value;
 22182            }
 183        }
 184
 22185        public SecurityContextSecurityTokenAuthenticator SessionTokenAuthenticator { get; }
 186
 187        public ISecurityContextSecurityTokenCache IssuedTokenCache
 188        {
 189            get
 190            {
 44191                return _issuedTokenCache;
 192            }
 193            set
 194            {
 22195                CommunicationObject.ThrowIfDisposedOrImmutable();
 22196                _issuedTokenCache = value;
 22197            }
 198        }
 199
 200        public SecurityStandardsManager StandardsManager
 201        {
 202            get
 203            {
 56204                return _standardsManager;
 205            }
 206            set
 207            {
 22208                CommunicationObject.ThrowIfDisposedOrImmutable();
 22209                if (value == null)
 210                {
 0211                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException(nameof(value)));
 212                }
 22213                if (!value.TrustDriver.IsSessionSupported)
 214                {
 0215                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.TrustDriverVersio
 216                }
 22217                if (!value.SecureConversationDriver.IsSessionSupported)
 218                {
 0219                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.SecureConversatio
 220                }
 22221                _standardsManager = value;
 22222            }
 223        }
 224
 225        public SecurityTokenParameters IssuedSecurityTokenParameters
 226        {
 227            get
 228            {
 64229                return _issuedTokenParameters;
 230            }
 231            set
 232            {
 22233                CommunicationObject.ThrowIfDisposedOrImmutable();
 22234                _issuedTokenParameters = value;
 22235            }
 236        }
 237
 238        public BindingContext IssuerBindingContext
 239        {
 240            get
 241            {
 242242                return _issuerBindingContext;
 243            }
 244            set
 245            {
 22246                CommunicationObject.ThrowIfDisposedOrImmutable();
 22247                if (value == null)
 248                {
 0249                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(value));
 250                }
 22251                _issuerBindingContext = value.Clone();
 22252            }
 253        }
 254
 255        public SecurityBindingElement BootstrapSecurityBindingElement
 256        {
 22257            get { return _bootstrapSecurityBindingElement; }
 258            set
 259            {
 22260                CommunicationObject.ThrowIfDisposedOrImmutable();
 22261                if (value == null)
 262                {
 0263                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(value));
 264                }
 22265                _bootstrapSecurityBindingElement = (SecurityBindingElement)value.Clone();
 22266            }
 267        }
 268
 269        public IMessageFilterTable<EndpointAddress> EndpointFilterTable
 270        {
 271            get
 272            {
 0273                return _endpointFilterTable;
 274            }
 275            set
 276            {
 22277                CommunicationObject.ThrowIfDisposedOrImmutable();
 22278                _endpointFilterTable = value;
 22279            }
 280        }
 281
 282        public Uri ListenUri
 283        {
 22284            get { return _listenUri; }
 285            set
 286            {
 22287                CommunicationObject.ThrowIfDisposedOrImmutable();
 22288                _listenUri = value;
 22289            }
 290        }
 291
 292        public virtual XmlDictionaryString IssueAction
 293        {
 294            get
 295            {
 32296                return _standardsManager.SecureConversationDriver.IssueAction;
 297            }
 298        }
 299
 300        public virtual XmlDictionaryString IssueResponseAction
 301        {
 302            get
 303            {
 10304                return _standardsManager.SecureConversationDriver.IssueResponseAction;
 305            }
 306        }
 307
 32308        public bool PreserveBootstrapTokens { get; set; }
 309
 310        public virtual XmlDictionaryString RenewAction
 311        {
 312            get
 313            {
 44314                return _standardsManager.SecureConversationDriver.RenewAction;
 315            }
 316        }
 317
 318        public virtual XmlDictionaryString RenewResponseAction
 319        {
 320            get
 321            {
 0322                return _standardsManager.SecureConversationDriver.RenewResponseAction;
 323            }
 324        }
 325
 326        public virtual XmlDictionaryString CloseAction
 327        {
 328            get
 329            {
 0330                return _standardsManager.SecureConversationDriver.CloseAction;
 331            }
 332        }
 333
 334        public virtual XmlDictionaryString CloseResponseAction
 335        {
 336            get
 337            {
 0338                return _standardsManager.SecureConversationDriver.CloseResponseAction;
 339            }
 340        }
 341
 342        //public bool RemoveCachedLogonToken(string username)
 343        //{
 344        //    if (this.RequestSecurityTokenListener != null)
 345        //    {
 346        //        //
 347        //        // this is the SCT case, delegate to the RST's listener list
 348        //        //
 349        //        IChannelListener listener = null;
 350        //        ILogonTokenCacheManager manager = null;
 351
 352        //        for (int i = 0; i < this.RequestSecurityTokenListener.ChannelDispatchers.Count; i++)
 353        //        {
 354        //            listener = this.RequestSecurityTokenListener.ChannelDispatchers[i].Listener;
 355
 356        //            if (listener != null)
 357        //            {
 358        //                manager = listener.GetProperty<ILogonTokenCacheManager>();
 359
 360        //                if (manager != null)
 361        //                    return manager.RemoveCachedLogonToken(username);
 362        //            }
 363        //        }
 364        //    }
 365        //    return false;
 366        //}
 367
 368        //public void FlushLogonTokenCache()
 369        //{
 370        //    if (this.RequestSecurityTokenListener != null && this.RequestSecurityTokenListener.ChannelDispatchers.Coun
 371        //    {
 372        //        //
 373        //        // this is the SCT case, delegate to the RST's listener list
 374        //        //
 375        //        IChannelListener listener = null;
 376        //        ILogonTokenCacheManager manager = null;
 377
 378        //        for (int i = 0; i < this.RequestSecurityTokenListener.ChannelDispatchers.Count; i++)
 379        //        {
 380        //            listener = this.RequestSecurityTokenListener.ChannelDispatchers[i].Listener;
 381
 382        //            if (listener != null)
 383        //            {
 384        //                manager = listener.GetProperty<ILogonTokenCacheManager>();
 385
 386        //                if (manager != null)
 387        //                    manager.FlushLogonTokenCache();
 388        //            }
 389        //        }
 390        //    }
 391
 392        // }
 393
 394        private Message HandleOperationException(SecuritySessionOperation operation, Message request, Exception e)
 395        {
 396            // SecurityTraceRecordHelper.TraceServerSessionOperationException(operation, e, this.ListenUri);
 0397            return CreateFault(request, e);
 398        }
 399
 400        private Message CreateFault(Message request, Exception e)
 401        {
 402            FaultCode subCode;
 403            FaultReason reason;
 404            bool isSenderFault;
 0405            if (e is QuotaExceededException)
 406            {
 407                // send a receiver fault so that the sender can retry
 0408                subCode = new FaultCode(DotNetSecurityStrings.SecurityServerTooBusyFault, DotNetSecurityStrings.Namespac
 0409                reason = new FaultReason(SR.PendingSessionsExceededFaultReason, CultureInfo.CurrentCulture);
 0410                isSenderFault = false;
 411            }
 0412            else if (e is EndpointNotFoundException)
 413            {
 414                // send a receiver fault so that the sender can retry
 0415                subCode = new FaultCode(AddressingStrings.EndpointUnavailable, request.Version.Addressing.Namespace);
 0416                reason = new FaultReason(SR.SecurityListenerClosingFaultReason, CultureInfo.CurrentCulture);
 0417                isSenderFault = false;
 418            }
 419            else
 420            {
 0421                subCode = new FaultCode(TrustApr2004Strings.InvalidRequestFaultCode, TrustFeb2005Strings.Namespace);
 0422                reason = new FaultReason(SR.InvalidRequestTrustFaultCode, CultureInfo.CurrentCulture);
 0423                isSenderFault = true;
 424            }
 425            FaultCode faultCode;
 0426            if (isSenderFault)
 427            {
 0428                faultCode = FaultCode.CreateSenderFaultCode(subCode);
 429            }
 430            else
 431            {
 0432                faultCode = FaultCode.CreateReceiverFaultCode(subCode);
 433            }
 0434            MessageFault fault = MessageFault.CreateFault(faultCode, reason);
 0435            Message faultReply = Message.CreateMessage(request.Version, fault, request.Version.Addressing.DefaultFaultAc
 0436            faultReply.Headers.RelatesTo = request.Headers.MessageId;
 0437            return faultReply;
 438        }
 439
 440        private void NotifyOperationCompletion(SecuritySessionOperation operation, SecurityContextSecurityToken newSessi
 441        {
 10442            if (operation == SecuritySessionOperation.Issue)
 443            {
 10444                if (IssuedSecurityTokenHandler != null)
 445                {
 10446                    IssuedSecurityTokenHandler(newSessionToken, remoteAddress);
 447                }
 448                else
 449                {
 0450                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperWarning(new SecurityNegotiationException(SR.Issu
 451                }
 452            }
 0453            else if (operation == SecuritySessionOperation.Renew)
 454            {
 0455                if (RenewedSecurityTokenHandler != null)
 456                {
 0457                    RenewedSecurityTokenHandler(newSessionToken, previousSessionToken);
 458                }
 459                else
 460                {
 0461                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperWarning(new SecurityNegotiationException(SR.Rene
 462                }
 463            }
 464            else
 465            {
 0466                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException());
 467            }
 468        }
 469
 470        public override Task CloseAsync(CancellationToken token)
 471        {
 472            /* TimeoutHelper timeoutHelper = new TimeoutHelper(timeout);
 473             if (this.rstListener != null)
 474             {
 475                 this.rstListener.Close(timeoutHelper.RemainingTime());
 476                 this.rstListener = null;
 477             }*/
 478
 0479            return base.CloseAsync(token);
 480        }
 481
 482        public override Task OpenAsync(CancellationToken token)
 483        {
 22484            if (BootstrapSecurityBindingElement == null)
 485            {
 0486                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.Format(SR.Boo
 487            }
 22488            if (IssuerBindingContext == null)
 489            {
 0490                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.Format(SR.Iss
 491            }
 22492            if (IssuedSecurityTokenParameters == null)
 493            {
 0494                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.Format(SR.Iss
 495            }
 22496            if (SecurityAlgorithmSuite == null)
 497            {
 0498                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.Format(SR.Sec
 499            }
 22500            if (IssuedTokenCache == null)
 501            {
 0502                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.Format(SR.Iss
 503            }
 504            //TimeoutHelper timeoutHelper = new TimeoutHelper(timeout);
 22505            SetupSessionListener();
 22506            ChannelDispatcher channelDispatcher = RequestSecurityTokenListener.InitializeRuntime(SecurityServiceDispatch
 22507            SecurityServiceDispatcher.SecurityAuthServiceDispatcher = new ServiceDispatcher(channelDispatcher);
 22508            _sctUri = StandardsManager.SecureConversationDriver.TokenTypeUri;
 22509            return base.OpenAsync();
 510            // base.OnOpen(timeoutHelper.RemainingTime());
 511        }
 512
 513        protected override bool CanValidateTokenCore(SecurityToken token)
 514        {
 40515            return (token is SecurityContextSecurityToken);
 516        }
 517
 518        protected override ValueTask<ReadOnlyCollection<IAuthorizationPolicy>> ValidateTokenCoreAsync(SecurityToken toke
 519        {
 20520            SecurityContextSecurityToken sct = (SecurityContextSecurityToken)token;
 20521            return new ValueTask<ReadOnlyCollection<IAuthorizationPolicy>>(sct.AuthorizationPolicies);
 522        }
 523
 524        private static bool IsSameIdentity(ReadOnlyCollection<IAuthorizationPolicy> authorizationPolicies, ServiceSecuri
 525        {
 0526            Claim identityClaim = SecurityUtils.GetPrimaryIdentityClaim(authorizationPolicies);
 527
 0528            if (identityClaim == null)
 529            {
 0530                return incomingContext.IsAnonymous;
 531            }
 532            else
 533            {
 0534                return Claim.DefaultComparer.Equals(incomingContext.IdentityClaim, identityClaim);
 535            }
 536        }
 537
 538        private DateTime GetKeyExpirationTime(SecurityToken currentToken, DateTime keyEffectiveTime)
 539        {
 10540            DateTime keyExpirationTime = TimeoutHelper.Add(keyEffectiveTime, _keyRenewalInterval);
 10541            DateTime tokenExpirationTime = (currentToken != null) ? currentToken.ValidTo : TimeoutHelper.Add(keyEffectiv
 10542            if (keyExpirationTime > tokenExpirationTime)
 543            {
 0544                keyExpirationTime = tokenExpirationTime;
 545            }
 10546            return keyExpirationTime;
 547        }
 548
 549        internal static ReadOnlyCollection<IAuthorizationPolicy> CreateSecureConversationPolicies(SecurityMessagePropert
 550        {
 0551            return CreateSecureConversationPolicies(security, null, expirationTime);
 552        }
 553
 554        private static ReadOnlyCollection<IAuthorizationPolicy> CreateSecureConversationPolicies(SecurityMessageProperty
 555        {
 10556            if (security == null)
 557            {
 0558                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(security));
 559            }
 560
 10561            List<IAuthorizationPolicy> authorizationPolicies = new List<IAuthorizationPolicy>();
 10562            if ((security.ServiceSecurityContext != null) &&
 10563                (security.ServiceSecurityContext.AuthorizationPolicies != null))
 564            {
 10565                authorizationPolicies.AddRange(security.ServiceSecurityContext.AuthorizationPolicies);
 566
 567                // Remove any Transport token policies. We do not include
 568                // these in the SCT as these policies will be available with
 569                // the application messages as well.
 10570                if ((security.TransportToken != null) &&
 10571                    (security.TransportToken.SecurityTokenPolicies != null) &&
 10572                    (security.TransportToken.SecurityTokenPolicies.Count > 0))
 573                {
 0574                    foreach (IAuthorizationPolicy policy in security.TransportToken.SecurityTokenPolicies)
 575                    {
 0576                        if (authorizationPolicies.Contains(policy))
 577                        {
 0578                            authorizationPolicies.Remove(policy);
 579                        }
 580                    }
 581                }
 582
 10583                if (currentTokenPolicies != null)
 584                {
 0585                    for (int i = 0; i < currentTokenPolicies.Count; ++i)
 586                    {
 0587                        if (authorizationPolicies.Contains(currentTokenPolicies[i]))
 588                        {
 0589                            authorizationPolicies.Remove(currentTokenPolicies[i]);
 590                        }
 591                    }
 592                }
 593
 594                UnconditionalPolicy sctPolicy;
 44595                for (int i = 0; i < authorizationPolicies.Count; i++)
 596                {
 12597                    if (authorizationPolicies[i].GetType() == typeof(UnconditionalPolicy))
 598                    {
 10599                        UnconditionalPolicy bootstrapPolicy = (UnconditionalPolicy)authorizationPolicies[i];
 10600                        sctPolicy = new UnconditionalPolicy(bootstrapPolicy.PrimaryIdentity, bootstrapPolicy.Issuances, 
 10601                        authorizationPolicies[i] = sctPolicy;
 602                    }
 603                }
 604            }
 605
 10606            return authorizationPolicies.AsReadOnly();
 607        }
 608
 609        private SecurityContextSecurityToken IssueToken(RequestSecurityToken rst, Message request, SecurityContextSecuri
 610        {
 10611            if (rst.TokenType != null && rst.TokenType != _sctUri)
 612            {
 0613                throw TraceUtility.ThrowHelperWarning(new InvalidOperationException(SR.Format(SR.CannotIssueRstTokenType
 614            }
 615            // ensure that a SecurityContext is present in the message
 616            ServiceSecurityContext clientContext;
 10617            SecurityMessageProperty securityProperty = request.Properties.Security;
 10618            if (securityProperty != null)
 619            {
 10620                clientContext = securityProperty.ServiceSecurityContext;
 621            }
 622            else
 623            {
 0624                clientContext = ServiceSecurityContext.Anonymous;
 625            }
 10626            if (clientContext == null)
 627            {
 0628                throw TraceUtility.ThrowHelperWarning(new InvalidOperationException(SR.Format(SR.SecurityContextMissing,
 629            }
 10630            if (currentToken != null)
 631            {
 632                // ensure that the same party is renewing the token
 0633                if (!IsSameIdentity(currentToken.AuthorizationPolicies, clientContext))
 634                {
 0635                    throw TraceUtility.ThrowHelperWarning(new SecurityNegotiationException(SR.WrongIdentityRenewingToken
 636                }
 637            }
 638
 639            // check if the client specified entropy
 10640            WSTrust.Driver.ProcessRstAndIssueKey(rst, null, KeyEntropyMode, SecurityAlgorithmSuite, out int issuedKeySiz
 10641                out byte[] issuerEntropy, out byte[] proofKey, out SecurityToken proofToken);
 642            SecurityContextSecurityToken newToken;
 10643            DateTime keyEffectiveTime = DateTime.UtcNow;
 10644            DateTime keyExpirationTime = GetKeyExpirationTime(currentToken, keyEffectiveTime);
 10645            ReadOnlyCollection<IAuthorizationPolicy> authorizationPolicies = (securityProperty != null) ?
 10646                    CreateSecureConversationPolicies(securityProperty, currentTokenPolicies, keyExpirationTime) : EmptyR
 10647            if (currentToken != null)
 648            {
 0649                newToken = new SecurityContextSecurityToken(currentToken, SecurityUtils.GenerateId(), proofKey,
 0650                    SecurityUtils.GenerateUniqueId(), keyEffectiveTime, keyExpirationTime, authorizationPolicies);
 651            }
 652            else
 653            {
 10654                UniqueId contextId = SecurityUtils.GenerateUniqueId();
 10655                string id = SecurityUtils.GenerateId();
 10656                DateTime tokenEffectiveTime = keyEffectiveTime;
 10657                DateTime tokenExpirationTime = TimeoutHelper.Add(tokenEffectiveTime, _sessionTokenLifetime);
 10658                newToken = new SecurityContextSecurityToken(contextId, id, proofKey, tokenEffectiveTime, tokenExpiration
 10659                    keyExpirationTime, authorizationPolicies);
 10660                if (PreserveBootstrapTokens)
 661                {
 0662                    newToken.BootstrapMessageProperty = (securityProperty == null) ? null : (SecurityMessageProperty)sec
 0663                    SecurityUtils.ErasePasswordInUsernameTokenIfPresent(newToken.BootstrapMessageProperty);
 664                }
 665            }
 666
 10667            rstr = new RequestSecurityTokenResponse(_standardsManager)
 10668            {
 10669                Context = rst.Context,
 10670                KeySize = issuedKeySize,
 10671                RequestedUnattachedReference = IssuedSecurityTokenParameters.CreateKeyIdentifierClause(newToken, Securit
 10672                RequestedAttachedReference = IssuedSecurityTokenParameters.CreateKeyIdentifierClause(newToken, SecurityT
 10673                TokenType = _sctUri,
 10674                RequestedSecurityToken = newToken
 10675            };
 10676            if (issuerEntropy != null)
 677            {
 10678                rstr.SetIssuerEntropy(issuerEntropy);
 10679                rstr.ComputeKey = true;
 680            }
 10681            if (proofToken != null)
 682            {
 0683                rstr.RequestedProofToken = proofToken;
 684            }
 10685            rstr.SetLifetime(keyEffectiveTime, keyExpirationTime);
 10686            return newToken;
 687        }
 688
 689        private static SecurityTokenSpecification GetMatchingEndorsingSct(SecurityContextKeyIdentifierClause sctSkiClaus
 690        {
 0691            if (sctSkiClause == null)
 692            {
 0693                return null;
 694            }
 0695            for (int i = 0; i < supportingTokenProperty.IncomingSupportingTokens.Count; ++i)
 696            {
 0697                if (supportingTokenProperty.IncomingSupportingTokens[i].SecurityTokenAttachmentMode != SecurityTokenAtta
 0698                    && supportingTokenProperty.IncomingSupportingTokens[i].SecurityTokenAttachmentMode != SecurityTokenA
 699                {
 700                    continue;
 701                }
 0702                if (supportingTokenProperty.IncomingSupportingTokens[i].SecurityToken is SecurityContextSecurityToken sc
 703                {
 0704                    return supportingTokenProperty.IncomingSupportingTokens[i];
 705                }
 706            }
 0707            return null;
 708        }
 709
 710
 711        protected virtual Message ProcessRenewRequest(Message request)
 712        {
 0713            CommunicationObject.ThrowIfClosedOrNotOpen();
 714            try
 715            {
 716                // first verify that the session token being renewed is present as a supportingToken
 0717                SecurityMessageProperty supportingTokenProperty = request.Properties.Security;
 0718                if (supportingTokenProperty == null || !supportingTokenProperty.HasIncomingSupportingTokens)
 719                {
 0720                    throw TraceUtility.ThrowHelperWarning(new SecurityNegotiationException(SR.RenewSessionMissingSupport
 721                }
 722
 723                RequestSecurityToken rst;
 0724                XmlDictionaryReader bodyReader = request.GetReaderAtBodyContents();
 0725                using (bodyReader)
 726                {
 0727                    rst = StandardsManager.TrustDriver.CreateRequestSecurityToken(bodyReader);
 0728                    request.ReadFromBodyContentsToEnd(bodyReader);
 0729                }
 0730                if (rst.RequestType != StandardsManager.TrustDriver.RequestTypeRenew)
 731                {
 0732                    throw TraceUtility.ThrowHelperWarning(new SecurityNegotiationException(SR.Format(SR.InvalidRstReques
 733                }
 0734                if (rst.RenewTarget == null)
 735                {
 0736                    throw TraceUtility.ThrowHelperWarning(new SecurityNegotiationException(SR.NoRenewTargetSpecified), r
 737                }
 0738                SecurityContextKeyIdentifierClause sctSkiClause = rst.RenewTarget as SecurityContextKeyIdentifierClause;
 0739                SecurityTokenSpecification sessionToken = GetMatchingEndorsingSct(sctSkiClause, supportingTokenProperty)
 0740                if (sctSkiClause == null || sessionToken == null)
 741                {
 0742                    throw TraceUtility.ThrowHelperWarning(new SecurityNegotiationException(SR.Format(SR.BadRenewTarget, 
 743                }
 0744                SecurityContextSecurityToken newToken = IssueToken(rst, request, (SecurityContextSecurityToken)sessionTo
 0745                rstr.MakeReadOnly();
 0746                BodyWriter replyMessage = rstr;
 0747                if (StandardsManager.MessageSecurityVersion.TrustVersion == TrustVersion.WSTrust13)
 748                {
 0749                    List<RequestSecurityTokenResponse> rstrList = new List<RequestSecurityTokenResponse>(1)
 0750                    {
 0751                        rstr
 0752                    };
 0753                    RequestSecurityTokenResponseCollection rstrc = new RequestSecurityTokenResponseCollection(rstrList, 
 0754                    replyMessage = rstrc;
 755                }
 0756                NotifyOperationCompletion(SecuritySessionOperation.Renew, newToken, (SecurityContextSecurityToken)sessio
 0757                Message response = CreateReply(request, RenewResponseAction, replyMessage);
 758
 0759                if (!newToken.IsCookieMode)
 760                {
 0761                    _issuedTokenCache.AddContext(newToken);
 762                }
 0763                return response;
 764            }
 765            finally
 766            {
 0767                RemoveCachedTokensIfRequired(request.Properties.Security);
 0768            }
 0769        }
 770
 771        private static void AddTokenToRemoveIfRequired(SecurityToken token, Collection<SecurityContextSecurityToken> sct
 772        {
 10773            if (token is SecurityContextSecurityToken sct)
 774            {
 0775                sctsToRemove.Add(sct);
 776            }
 10777        }
 778
 779        internal static void RemoveCachedTokensIfRequired(SecurityMessageProperty security)
 780        {
 10781            if (security == null)
 782            {
 0783                return;
 784            }
 785            // ILogonTokenCacheManager logonManager = OperationContext.Current.EndpointDispatcher.ChannelDispatcher.List
 786
 787            // Collection<ISecurityContextSecurityTokenCache> sctCaches = OperationContext.Current.EndpointDispatcher.Ch
 788            // if ( (sctCaches == null || sctCaches.Count == 0))
 789            // {
 790            //     return;
 791            //  }
 792            //TODO debug and incorporate above logic
 10793            Collection<ISecurityContextSecurityTokenCache> sctCaches = new Collection<ISecurityContextSecurityTokenCache
 10794            Collection<SecurityContextSecurityToken> securityContextTokensToRemove = new Collection<SecurityContextSecur
 10795            if (security.ProtectionToken != null)
 796            {
 0797                AddTokenToRemoveIfRequired(security.ProtectionToken.SecurityToken, securityContextTokensToRemove);
 798            }
 10799            if (security.InitiatorToken != null)
 800            {
 0801                AddTokenToRemoveIfRequired(security.InitiatorToken.SecurityToken, securityContextTokensToRemove);
 802            }
 10803            if (security.HasIncomingSupportingTokens)
 804            {
 40805                for (int i = 0; i < security.IncomingSupportingTokens.Count; ++i)
 806                {
 10807                    if (security.IncomingSupportingTokens[i].SecurityTokenAttachmentMode == SecurityTokenAttachmentMode.
 10808                        || security.IncomingSupportingTokens[i].SecurityTokenAttachmentMode == SecurityTokenAttachmentMo
 10809                        || security.IncomingSupportingTokens[i].SecurityTokenAttachmentMode == SecurityTokenAttachmentMo
 810                    {
 10811                        AddTokenToRemoveIfRequired(security.IncomingSupportingTokens[i].SecurityToken, securityContextTo
 812                    }
 813                }
 814            }
 10815            if (sctCaches != null)
 816            {
 20817                for (int i = 0; i < securityContextTokensToRemove.Count; ++i)
 818                {
 0819                    for (int j = 0; j < sctCaches.Count; ++j)
 820                    {
 0821                        sctCaches[j].RemoveContext(securityContextTokensToRemove[i].ContextId, securityContextTokensToRe
 822                    }
 823                }
 824            }
 10825        }
 826
 827        protected virtual Message ProcessIssueRequest(Message request)
 828        {
 829            try
 830            {
 831                RequestSecurityToken rst;
 10832                using (XmlDictionaryReader bodyReader = request.GetReaderAtBodyContents())
 833                {
 10834                    rst = StandardsManager.TrustDriver.CreateRequestSecurityToken(bodyReader);
 10835                    request.ReadFromBodyContentsToEnd(bodyReader);
 10836                }
 10837                if (rst.RequestType != null && rst.RequestType != StandardsManager.TrustDriver.RequestTypeIssue)
 838                {
 0839                    throw TraceUtility.ThrowHelperWarning(new SecurityNegotiationException(SR.Format(SR.InvalidRstReques
 840                }
 841                // echo the AppliesTo in the reply if it is an issue request
 10842                EndpointAddress appliesTo = null;
 843                DataContractSerializer appliesToSerializer;
 10844                rst.GetAppliesToQName(out string appliesToName, out string appliesToNamespace);
 10845                if (appliesToName == AddressingStrings.EndpointReference && appliesToNamespace == request.Version.Addres
 846                {
 0847                    if (request.Version.Addressing == AddressingVersion.WSAddressing10)
 848                    {
 0849                        appliesToSerializer = DataContractSerializerDefaults.CreateSerializer(typeof(EndpointAddress10),
 0850                        appliesTo = rst.GetAppliesTo<EndpointAddress10>(appliesToSerializer).ToEndpointAddress();
 851                    }
 0852                    else if (request.Version.Addressing == AddressingVersion.WSAddressingAugust2004)
 853                    {
 0854                        appliesToSerializer = DataContractSerializerDefaults.CreateSerializer(typeof(EndpointAddressAugu
 0855                        appliesTo = rst.GetAppliesTo<EndpointAddressAugust2004>(appliesToSerializer).ToEndpointAddress()
 856                    }
 857                    else
 858                    {
 0859                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
 0860                            new ProtocolException(SR.Format(SR.AddressingVersionNotSupported, request.Version.Addressing
 861                    }
 862                }
 863                else
 864                {
 10865                    appliesTo = null;
 10866                    appliesToSerializer = null;
 867                }
 10868                if (_shouldMatchRstWithEndpointFilter)
 869                {
 2870                    SecurityUtils.MatchRstWithEndpointFilter(request, _endpointFilterTable, _listenUri);
 871                }
 10872                SecurityContextSecurityToken issuedToken = IssueToken(rst, request, null, null, out RequestSecurityToken
 10873                if (appliesTo != null)
 874                {
 0875                    if (request.Version.Addressing == AddressingVersion.WSAddressing10)
 876                    {
 0877                        rstr.SetAppliesTo<EndpointAddress10>(EndpointAddress10.FromEndpointAddress(appliesTo), appliesTo
 878                    }
 0879                    else if (request.Version.Addressing == AddressingVersion.WSAddressingAugust2004)
 880                    {
 0881                        rstr.SetAppliesTo<EndpointAddressAugust2004>(EndpointAddressAugust2004.FromEndpointAddress(appli
 882                    }
 883                    else
 884                    {
 0885                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
 0886                            new ProtocolException(SR.Format(SR.AddressingVersionNotSupported, request.Version.Addressing
 887                    }
 888                }
 10889                rstr.MakeReadOnly();
 10890                BodyWriter replyMessage = rstr;
 10891                if (StandardsManager.MessageSecurityVersion.TrustVersion == TrustVersion.WSTrust13)
 892                {
 4893                    List<RequestSecurityTokenResponse> rstrList = new List<RequestSecurityTokenResponse>(1)
 4894                    {
 4895                        rstr
 4896                    };
 4897                    RequestSecurityTokenResponseCollection rstrc = new RequestSecurityTokenResponseCollection(rstrList, 
 4898                    replyMessage = rstrc;
 899                }
 10900                NotifyOperationCompletion(SecuritySessionOperation.Issue, issuedToken, null, request.Headers.ReplyTo);
 10901                Message response = CreateReply(request, IssueResponseAction, replyMessage);
 10902                if (!issuedToken.IsCookieMode)
 903                {
 10904                    _issuedTokenCache.AddContext(issuedToken);
 905                }
 10906                return response;
 907            }
 908            finally
 909            {
 10910                RemoveCachedTokensIfRequired(request.Properties.Security);
 10911            }
 10912        }
 913
 914        internal static bool DoesSkiClauseMatchSigningToken(SecurityContextKeyIdentifierClause skiClause, Message reques
 915        {
 10916            SecurityMessageProperty securityProperty = request.Properties.Security;
 10917            if (securityProperty == null)
 918            {
 0919                throw TraceUtility.ThrowHelperWarning(new SecurityNegotiationException(SR.SFxSecurityContextPropertyMiss
 920            }
 10921            SecurityContextSecurityToken sct = (securityProperty.ProtectionToken != null) ? (securityProperty.Protection
 10922            if (sct != null && skiClause.Matches(sct.ContextId, sct.KeyGeneration))
 923            {
 0924                return true;
 925            }
 926
 10927            if (securityProperty.HasIncomingSupportingTokens)
 928            {
 20929                for (int i = 0; i < securityProperty.IncomingSupportingTokens.Count; ++i)
 930                {
 10931                    if (securityProperty.IncomingSupportingTokens[i].SecurityTokenAttachmentMode == SecurityTokenAttachm
 932                    {
 10933                        sct = securityProperty.IncomingSupportingTokens[i].SecurityToken as SecurityContextSecurityToken
 10934                        if (sct != null && skiClause.Matches(sct.ContextId, sct.KeyGeneration))
 935                        {
 10936                            return true;
 937                        }
 938                    }
 939                }
 940            }
 0941            return false;
 942        }
 943
 944        private static Message CreateReply(Message request, XmlDictionaryString action, BodyWriter body)
 945        {
 10946            if (request.Headers.MessageId != null)
 947            {
 10948                Message reply = Message.CreateMessage(request.Version, ActionHeader.Create(action, request.Version.Addre
 10949                reply.InitializeReply(request);
 10950                return reply;
 951            }
 952            else
 953            {
 954                // the message id may not be present if MapToHttp is true
 0955                return Message.CreateMessage(request.Version, ActionHeader.Create(action, request.Version.Addressing), b
 956            }
 957        }
 958
 959        private Message ProcessRequest(Message request)
 960        {
 10961            SecuritySessionOperation operation = SecuritySessionOperation.None;
 962            try
 963            {
 10964                if (request == null)
 965                {
 0966                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(request));
 967                }
 10968                if (request.Headers.Action == IssueAction.Value)
 969                {
 10970                    operation = SecuritySessionOperation.Issue;
 10971                    return ProcessIssueRequest(request);
 972                }
 0973                else if (request.Headers.Action == RenewAction.Value)
 974                {
 0975                    operation = SecuritySessionOperation.Renew;
 0976                    return ProcessRenewRequest(request);
 977                }
 978                else
 979                {
 0980                    throw TraceUtility.ThrowHelperWarning(new SecurityNegotiationException(SR.Format(SR.InvalidActionFor
 981                }
 982            }
 0983            catch (Exception e)
 984            {
 0985                if (Fx.IsFatal(e))
 986                {
 0987                    throw;
 988                }
 989
 0990                return HandleOperationException(operation, request, e);
 991            }
 10992        }
 993
 44994        internal SecuritySessionHost RequestSecurityTokenListener { get; private set; }
 995
 996        private void SetupSessionListener()
 997        {
 998            //ChannelBuilder channelBuilder = new ChannelBuilder(this.IssuerBindingContext, false); //TODO addChannelDem
 999            //channelBuilder.Binding.Elements.Insert(0, new ReplyAdapterBindingElement());
 1000            //channelBuilder.Binding.Elements.Insert(0, new SecuritySessionAuthenticatorBindingElement(this));
 1001
 221002            List<string> supportedMessageActions = new List<string>
 221003            {
 221004                IssueAction.Value,
 221005                RenewAction.Value
 221006            };
 221007            SecurityBindingElement securityBindingElement = IssuerBindingContext.Binding.Elements.Find<SecurityBindingEl
 881008            foreach (SecurityTokenParameters stp in new SecurityTokenParametersEnumerable(securityBindingElement))
 1009            {
 221010                if (stp is SecureConversationSecurityTokenParameters)
 1011                {
 221012                    SecureConversationSecurityTokenParameters scstp = (SecureConversationSecurityTokenParameters)stp;
 221013                    if (!scstp.CanRenewSession)
 1014                    {
 01015                        supportedMessageActions.Remove(RenewAction.Value);
 01016                        break;
 1017                    }
 1018                }
 1019            }
 221020            MessageFilter issueAndRenewFilter = new SessionActionFilter(_standardsManager, supportedMessageActions.ToArr
 221021            SecuritySessionHost sessionListener = new SecuritySessionHost(this, issueAndRenewFilter, ListenUri);
 221022            RequestSecurityTokenListener = sessionListener;
 221023        }
 1024
 1025
 1026        internal void BuildResponderChannelListener<TChannel>(BindingContext context, SecurityServiceDispatcher security
 1027            where TChannel : class, IChannel
 1028        {
 221029            SecurityCredentialsManager securityCredentials = IssuerBindingContext.BindingParameters.Find<SecurityCredent
 221030            if (securityCredentials == null)
 1031            {
 01032                securityCredentials = ServiceCredentials.CreateDefaultCredentials();
 1033            }
 221034            _bootstrapSecurityBindingElement.ReaderQuotas = IssuerBindingContext.GetInnerProperty<XmlDictionaryReaderQuo
 221035            if (_bootstrapSecurityBindingElement.ReaderQuotas == null)
 1036            {
 01037                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.EncodingBindi
 1038            }
 1039
 221040            TransportBindingElement transportBindingElement = context.RemainingBindingElements.Find<TransportBindingElem
 221041            if (transportBindingElement != null)
 1042            {
 221043                _bootstrapSecurityBindingElement.MaxReceivedMessageSize = transportBindingElement.MaxReceivedMessageSize
 1044            }
 1045
 221046            SecurityProtocolFactory bootstrapSecurityProtocolFactory = _bootstrapSecurityBindingElement.CreateSecurityPr
 221047            if (bootstrapSecurityProtocolFactory is MessageSecurityProtocolFactory)
 1048            {
 01049                MessageSecurityProtocolFactory soapBindingFactory = (MessageSecurityProtocolFactory)bootstrapSecurityPro
 01050                soapBindingFactory.ApplyConfidentiality = soapBindingFactory.ApplyIntegrity
 01051                = soapBindingFactory.RequireConfidentiality = soapBindingFactory.RequireIntegrity = true;
 1052
 01053                soapBindingFactory.ProtectionRequirements.IncomingSignatureParts.ChannelParts.IsBodyIncluded = true;
 01054                soapBindingFactory.ProtectionRequirements.OutgoingSignatureParts.ChannelParts.IsBodyIncluded = true;
 1055
 01056                MessagePartSpecification bodyPart = new MessagePartSpecification(true);
 01057                soapBindingFactory.ProtectionRequirements.OutgoingSignatureParts.AddParts(bodyPart, IssueResponseAction)
 01058                soapBindingFactory.ProtectionRequirements.OutgoingEncryptionParts.AddParts(bodyPart, IssueResponseAction
 01059                soapBindingFactory.ProtectionRequirements.OutgoingSignatureParts.AddParts(bodyPart, RenewResponseAction)
 01060                soapBindingFactory.ProtectionRequirements.OutgoingEncryptionParts.AddParts(bodyPart, RenewResponseAction
 1061
 01062                soapBindingFactory.ProtectionRequirements.IncomingSignatureParts.AddParts(bodyPart, IssueAction);
 01063                soapBindingFactory.ProtectionRequirements.IncomingEncryptionParts.AddParts(bodyPart, IssueAction);
 01064                soapBindingFactory.ProtectionRequirements.IncomingSignatureParts.AddParts(bodyPart, RenewAction);
 01065                soapBindingFactory.ProtectionRequirements.IncomingEncryptionParts.AddParts(bodyPart, RenewAction);
 1066            }
 1067
 221068            SupportingTokenParameters renewSupportingTokenParameters = new SupportingTokenParameters();
 221069            SecurityContextSecurityTokenParameters sctParameters = new SecurityContextSecurityTokenParameters
 221070            {
 221071                RequireDerivedKeys = IssuedSecurityTokenParameters.RequireDerivedKeys
 221072            };
 221073            renewSupportingTokenParameters.Endorsing.Add(sctParameters);
 221074            bootstrapSecurityProtocolFactory.SecurityBindingElement.OperationSupportingTokenParameters.Add(RenewAction.V
 221075            bootstrapSecurityProtocolFactory.SecurityTokenManager = new SessionRenewSecurityTokenManager(bootstrapSecuri
 1076
 1077            //We are passing as arguments to use existing dispatcher instead of creating another forwarding dispatcher
 1078            // SecurityChannelListener<TChannel> securityChannelListener = new SecurityChannelListener<TChannel>(
 1079            //     this.bootstrapSecurityBindingElement, this.IssuerBindingContext);
 221080            securityServiceDispatcher.SecurityProtocolFactory = bootstrapSecurityProtocolFactory;
 221081            securityServiceDispatcher.SendUnsecuredFaults = true;
 221082            if (bootstrapSecurityProtocolFactory.ListenUri == null)
 221083                bootstrapSecurityProtocolFactory.ListenUri = _listenUri;
 221084            bootstrapSecurityProtocolFactory.OpenAsync(ServiceDefaults.OpenTimeout);
 1085            //TODO if/when we add support for composite duplex bindings, this will need to be false if the binding is a 
 1086            //securityServiceDispatcher.SendUnsecuredFaults = !SecurityUtils.IsCompositeDuplexBinding(context);
 1087
 1088            // ChannelBuilder channelBuilder = new ChannelBuilder(context, true);
 1089            // securityChannelListener.InitializeListener(channelBuilder);
 221090            _shouldMatchRstWithEndpointFilter = SecurityUtils.ShouldMatchRstWithEndpointFilter(_bootstrapSecurityBinding
 1091            //return securityChannelListener;
 221092        }
 1093
 1094        internal class SecuritySessionHost //: ServiceHostBase
 1095        {
 1096            //ChannelBuilder channelBuilder;
 1097            private readonly MessageFilter _filter;
 1098            private readonly Uri _listenUri;
 1099            private readonly SecuritySessionSecurityTokenAuthenticator _authenticator;
 1100
 221101            public SecuritySessionHost(SecuritySessionSecurityTokenAuthenticator authenticator, MessageFilter filter, Ur
 1102            {
 221103                _authenticator = authenticator;
 221104                _filter = filter;
 221105                _listenUri = listenUri;
 221106            }
 1107
 1108            internal ChannelDispatcher InitializeRuntime(SecurityServiceDispatcher securityDispatcher)
 1109            {
 221110                if (securityDispatcher.AcceptorChannelType.Equals(typeof(IReplyChannel)))
 1111                {
 191112                    return InitializeRuntime<IReplyChannel>(securityDispatcher);
 1113                }
 1114
 31115                if (securityDispatcher.AcceptorChannelType.Equals(typeof(IDuplexSessionChannel)))
 1116                {
 31117                    return InitializeRuntime<IDuplexSessionChannel>(securityDispatcher);
 1118                }
 1119
 01120                throw new NotImplementedException();
 1121            }
 1122
 1123            internal ChannelDispatcher InitializeRuntime<TChannel>(SecurityServiceDispatcher securityDispatcher) where T
 1124            {
 221125                MessageFilter contractFilter = _filter;
 221126                int filterPriority = int.MaxValue - 10;
 221127                List<Type> endpointChannelTypes = new List<Type> {  typeof(IReplyChannel),
 221128                                                           typeof(IDuplexChannel),
 221129                                                           typeof(IReplySessionChannel),
 221130                                                           typeof(IDuplexSessionChannel) };
 1131
 1132                //  IChannelListener listener = null;
 1133                //  BindingParameterCollection parameters = new BindingParameterCollection(this.channelBuilder.BindingPa
 1134                //  Binding binding = this.channelBuilder.Binding;
 1135                //  binding.ReceiveTimeout = this.authenticator.NegotiationTimeout;
 1136                // parameters.Add(new ChannelDemuxerFilter(contractFilter, filterPriority));
 1137                // DispatcherBuilder.MaybeCreateListener(true, endpointChannelTypes, binding, parameters,
 1138                //                                      this.listenUri, "", ListenUriMode.Explicit, this.ServiceThrottle
 1139                //   if (listener == null)
 1140                // {
 1141                //      throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.Forma
 1142                //  }
 1143
 1144                //Replacing above code by below 3 lines.(adding securityservicedispatcher to demuxer, how to respond)
 1145
 221146                Binding binding = _authenticator.IssuerBindingContext.Binding;
 221147                binding.ReceiveTimeout = _authenticator.NegotiationTimeout;
 221148                securityDispatcher.ChannelBuilder.AddServiceDispatcher<TChannel>(securityDispatcher, new ChannelDemuxerF
 1149
 1150                //Injecting here the BuildResponderChannelListener
 221151                _authenticator.BuildResponderChannelListener<TChannel>(_authenticator.IssuerBindingContext, securityDisp
 1152                //end
 1153
 221154                var bindingQname = new XmlQualifiedName(binding.Name, binding.Namespace);
 221155                var channelDispatcher = new ChannelDispatcher(_listenUri, binding, bindingQname.ToString(), binding, end
 221156                {
 221157                    MessageVersion = binding.MessageVersion,
 221158                    ManualAddressing = true
 221159                };
 1160                //  channelDispatcher.ServiceThrottle = new ServiceThrottle(this);
 1161                //  channelDispatcher.ServiceThrottle.MaxConcurrentCalls = this.authenticator.MaximumConcurrentNegotiati
 1162                //  channelDispatcher.ServiceThrottle.MaxConcurrentSessions = this.authenticator.MaximumConcurrentNegoti
 1163
 221164                EndpointDispatcher endpointDispatcher = new EndpointDispatcher(new EndpointAddress(_listenUri), "IssueAn
 221165                endpointDispatcher.DispatchRuntime.SingletonInstanceContext = new InstanceContext(null, _authenticator, 
 221166                endpointDispatcher.DispatchRuntime.ConcurrencyMode = ConcurrencyMode.Multiple;
 221167                endpointDispatcher.AddressFilter = new MatchAllMessageFilter();
 221168                endpointDispatcher.ContractFilter = contractFilter;
 221169                endpointDispatcher.FilterPriority = filterPriority;
 221170                endpointDispatcher.DispatchRuntime.PrincipalPermissionMode = PrincipalPermissionMode.None;
 221171                endpointDispatcher.DispatchRuntime.InstanceContextProvider = new SingletonInstanceContextProvider(endpoi
 221172                endpointDispatcher.DispatchRuntime.SynchronizationContext = null;
 1173
 221174                if (_authenticator.IssuerBindingContext != null && _authenticator.IssuerBindingContext.BindingParameters
 1175                {
 221176                    ServiceAuthenticationManager serviceAuthenticationManager = _authenticator.IssuerBindingContext.Bind
 221177                    if (serviceAuthenticationManager != null)
 1178                    {
 01179                        endpointDispatcher.DispatchRuntime.ServiceAuthenticationManager = new SCTServiceAuthenticationMa
 1180                    }
 1181                }
 1182
 221183                DispatchOperation operation = new DispatchOperation(endpointDispatcher.DispatchRuntime, "*", MessageHead
 221184                {
 221185                    Formatter = new MessageOperationFormatter(),
 221186                    Invoker = new SecuritySessionAuthenticatorInvoker(_authenticator)
 221187                };
 1188
 221189                endpointDispatcher.DispatchRuntime.UnhandledDispatchOperation = operation;
 221190                channelDispatcher.Endpoints.Add(endpointDispatcher);
 221191                channelDispatcher.Init();
 221192                Task openTask = channelDispatcher.OpenAsync();
 1193                Fx.Assert(openTask.IsCompleted, "ChannelDispatcher should open synchronously");
 221194                openTask.GetAwaiter().GetResult();
 221195                return channelDispatcher;
 1196            }
 1197
 1198            private class SecuritySessionAuthenticatorInvoker : IOperationInvoker
 1199            {
 1200                private readonly SecuritySessionSecurityTokenAuthenticator _parent;
 1201
 221202                internal SecuritySessionAuthenticatorInvoker(SecuritySessionSecurityTokenAuthenticator parent)
 1203                {
 221204                    _parent = parent;
 221205                }
 1206
 01207                public bool IsSynchronous { get { return true; } }
 1208
 1209                public object[] AllocateInputs()
 1210                {
 101211                    return EmptyArray<object>.Allocate(1);
 1212                }
 1213
 1214                public ValueTask<(object returnValue, object[] outputs)> InvokeAsync(object instance, object[] inputs)
 1215                {
 101216                    object[] outputs = EmptyArray<object>.Allocate(0);
 101217                    if (!(inputs[0] is Message message))
 1218                    {
 01219                        return new ValueTask<(object returnValue, object[] outputs)>(((object)null, outputs));
 1220                    }
 101221                    object returnVal = _parent.ProcessRequest(message);
 101222                    return new ValueTask<(object returnValue, object[] outputs)>((returnVal, outputs));
 1223                }
 1224            }
 1225        }
 1226
 1227        private class SecuritySessionAuthenticatorBindingElement : BindingElement
 1228        {
 1229            private readonly SecuritySessionSecurityTokenAuthenticator _authenticator;
 1230
 01231            public SecuritySessionAuthenticatorBindingElement(SecuritySessionSecurityTokenAuthenticator authenticator)
 1232            {
 01233                _authenticator = authenticator;
 01234            }
 1235
 1236            public override BindingElement Clone()
 1237            {
 01238                return new SecuritySessionAuthenticatorBindingElement(_authenticator);
 1239            }
 1240
 1241            public override T GetProperty<T>(BindingContext context)
 1242            {
 01243                if (typeof(T) == typeof(ISecurityCapabilities))
 1244                {
 01245                    return (T)(object)_authenticator.BootstrapSecurityBindingElement.GetProperty<ISecurityCapabilities>(
 1246                }
 1247
 01248                return context.GetInnerProperty<T>();
 1249            }
 1250        }
 1251
 1252        public class SessionRenewSecurityTokenManager : SecurityTokenManager
 1253        {
 1254            private readonly SecurityTokenManager _innerTokenManager;
 1255            private readonly SecurityTokenAuthenticator _renewTokenAuthenticator;
 1256            private readonly SecurityTokenResolver _renewTokenResolver;
 1257
 221258            public SessionRenewSecurityTokenManager(SecurityTokenManager innerTokenManager, SecurityTokenAuthenticator r
 221259                SecurityTokenResolver renewTokenResolver)
 1260            {
 221261                _innerTokenManager = innerTokenManager;
 221262                _renewTokenAuthenticator = renewTokenAuthenticator;
 221263                _renewTokenResolver = renewTokenResolver;
 221264            }
 1265
 1266            public override SecurityTokenAuthenticator CreateSecurityTokenAuthenticator(SecurityTokenRequirement tokenRe
 1267            {
 441268                if (tokenRequirement == null)
 1269                {
 01270                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(tokenRequirement));
 1271                }
 1272
 441273                if (tokenRequirement.TokenType == ServiceModelSecurityTokenTypes.SecurityContext)
 1274                {
 221275                    outOfBandTokenResolver = _renewTokenResolver;
 221276                    return _renewTokenAuthenticator;
 1277                }
 1278                else
 1279                {
 221280                    return _innerTokenManager.CreateSecurityTokenAuthenticator(tokenRequirement, out outOfBandTokenResol
 1281                }
 1282            }
 1283
 1284            public override SecurityTokenProvider CreateSecurityTokenProvider(SecurityTokenRequirement requirement)
 1285            {
 01286                return _innerTokenManager.CreateSecurityTokenProvider(requirement);
 1287            }
 1288
 1289            public override SecurityTokenSerializer CreateSecurityTokenSerializer(SecurityTokenVersion version)
 1290            {
 01291                return _innerTokenManager.CreateSecurityTokenSerializer(version);
 1292            }
 1293        }
 1294    }
 1295
 1296    internal class SessionActionFilter : HeaderFilter
 1297    {
 1298        private readonly SecurityStandardsManager _standardsManager;
 1299        private readonly string[] _actions;
 1300
 1301        public SessionActionFilter(SecurityStandardsManager standardsManager, params string[] actions)
 1302        {
 1303            _actions = actions;
 1304            _standardsManager = standardsManager;
 1305        }
 1306
 1307        public override bool Match(Message message)
 1308        {
 1309            for (int i = 0; i < _actions.Length; ++i)
 1310            {
 1311                if (message.Headers.Action == _actions[i])
 1312                {
 1313                    return _standardsManager.DoesMessageContainSecurityHeader(message);
 1314                }
 1315            }
 1316            return false;
 1317        }
 1318    }
 1319}

Methods/Properties

.cctor()
.ctor()
IssuedSecurityTokenHandler()
RenewedSecurityTokenHandler()
SecurityServiceDispatcher()
SecurityAlgorithmSuite()
SecurityAlgorithmSuite(CoreWCF.Security.SecurityAlgorithmSuite)
KeyEntropyMode()
KeyEntropyMode(CoreWCF.Security.SecurityKeyEntropyMode)
IsClientAnonymous()
IsClientAnonymous(System.Boolean)
SessionTokenLifetime()
SessionTokenLifetime(System.TimeSpan)
KeyRenewalInterval()
KeyRenewalInterval(System.TimeSpan)
MaximumConcurrentNegotiations()
MaximumConcurrentNegotiations(System.Int32)
NegotiationTimeout()
NegotiationTimeout(System.TimeSpan)
SessionTokenAuthenticator()
IssuedTokenCache()
IssuedTokenCache(CoreWCF.Security.Tokens.ISecurityContextSecurityTokenCache)
StandardsManager()
StandardsManager(CoreWCF.Security.SecurityStandardsManager)
IssuedSecurityTokenParameters()
IssuedSecurityTokenParameters(CoreWCF.Security.Tokens.SecurityTokenParameters)
IssuerBindingContext()
IssuerBindingContext(CoreWCF.Channels.BindingContext)
BootstrapSecurityBindingElement()
BootstrapSecurityBindingElement(CoreWCF.Channels.SecurityBindingElement)
EndpointFilterTable()
EndpointFilterTable(CoreWCF.Dispatcher.IMessageFilterTable`1<CoreWCF.EndpointAddress>)
ListenUri()
ListenUri(System.Uri)
IssueAction()
IssueResponseAction()
PreserveBootstrapTokens()
RenewAction()
RenewResponseAction()
CloseAction()
CloseResponseAction()
HandleOperationException(CoreWCF.Security.SecuritySessionOperation,CoreWCF.Channels.Message,System.Exception)
CreateFault(CoreWCF.Channels.Message,System.Exception)
NotifyOperationCompletion(CoreWCF.Security.SecuritySessionOperation,CoreWCF.Security.Tokens.SecurityContextSecurityToken,CoreWCF.Security.Tokens.SecurityContextSecurityToken,CoreWCF.EndpointAddress)
CloseAsync(System.Threading.CancellationToken)
OpenAsync(System.Threading.CancellationToken)
CanValidateTokenCore(CoreWCF.IdentityModel.Tokens.SecurityToken)
ValidateTokenCoreAsync(CoreWCF.IdentityModel.Tokens.SecurityToken)
IsSameIdentity(System.Collections.ObjectModel.ReadOnlyCollection`1<CoreWCF.IdentityModel.Policy.IAuthorizationPolicy>,CoreWCF.ServiceSecurityContext)
GetKeyExpirationTime(CoreWCF.IdentityModel.Tokens.SecurityToken,System.DateTime)
CreateSecureConversationPolicies(CoreWCF.Security.SecurityMessageProperty,System.DateTime)
CreateSecureConversationPolicies(CoreWCF.Security.SecurityMessageProperty,System.Collections.ObjectModel.ReadOnlyCollection`1<CoreWCF.IdentityModel.Policy.IAuthorizationPolicy>,System.DateTime)
IssueToken(CoreWCF.Security.RequestSecurityToken,CoreWCF.Channels.Message,CoreWCF.Security.Tokens.SecurityContextSecurityToken,System.Collections.ObjectModel.ReadOnlyCollection`1<CoreWCF.IdentityModel.Policy.IAuthorizationPolicy>,CoreWCF.Security.RequestSecurityTokenResponse&)
GetMatchingEndorsingSct(CoreWCF.Security.SecurityContextKeyIdentifierClause,CoreWCF.Security.SecurityMessageProperty)
ProcessRenewRequest(CoreWCF.Channels.Message)
AddTokenToRemoveIfRequired(CoreWCF.IdentityModel.Tokens.SecurityToken,System.Collections.ObjectModel.Collection`1<CoreWCF.Security.Tokens.SecurityContextSecurityToken>)
RemoveCachedTokensIfRequired(CoreWCF.Security.SecurityMessageProperty)
ProcessIssueRequest(CoreWCF.Channels.Message)
DoesSkiClauseMatchSigningToken(CoreWCF.Security.SecurityContextKeyIdentifierClause,CoreWCF.Channels.Message)
CreateReply(CoreWCF.Channels.Message,System.Xml.XmlDictionaryString,CoreWCF.Channels.BodyWriter)
ProcessRequest(CoreWCF.Channels.Message)
RequestSecurityTokenListener()
SetupSessionListener()
BuildResponderChannelListener(CoreWCF.Channels.BindingContext,CoreWCF.Dispatcher.SecurityServiceDispatcher)
.ctor(CoreWCF.Security.SecuritySessionSecurityTokenAuthenticator,CoreWCF.Dispatcher.MessageFilter,System.Uri)
InitializeRuntime(CoreWCF.Dispatcher.SecurityServiceDispatcher)
.ctor(CoreWCF.Security.SecuritySessionSecurityTokenAuthenticator)
IsSynchronous()
AllocateInputs()
InvokeAsync(System.Object,System.Object[])
.ctor(CoreWCF.Security.SecuritySessionSecurityTokenAuthenticator)
Clone()
GetProperty(CoreWCF.Channels.BindingContext)
.ctor(CoreWCF.IdentityModel.Selectors.SecurityTokenManager,CoreWCF.IdentityModel.Selectors.SecurityTokenAuthenticator,CoreWCF.IdentityModel.Selectors.SecurityTokenResolver)
CreateSecurityTokenAuthenticator(CoreWCF.IdentityModel.Selectors.SecurityTokenRequirement,CoreWCF.IdentityModel.Selectors.SecurityTokenResolver&)
CreateSecurityTokenProvider(CoreWCF.IdentityModel.Selectors.SecurityTokenRequirement)
CreateSecurityTokenSerializer(CoreWCF.IdentityModel.Selectors.SecurityTokenVersion)