< Summary - CoreWCF Coverage — PR #1766

Information
Class: CoreWCF.Security.ServiceCredentialsSecurityTokenManager
Assembly: CoreWCF.Primitives
File(s): /home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/Security/ServiceCredentialsSecurityTokenManager.cs
Line coverage
51%
Covered lines: 108
Uncovered lines: 100
Coverable lines: 208
Total lines: 535
Line coverage: 51.9%
Branch coverage
33%
Covered branches: 43
Total branches: 130
Branch coverage: 33%
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/ServiceCredentialsSecurityTokenManager.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.Net;
 8using System.Security.Authentication.ExtendedProtection;
 9using CoreWCF.Channels;
 10using CoreWCF.Description;
 11using CoreWCF.Dispatcher;
 12using CoreWCF.IdentityModel.Selectors;
 13using CoreWCF.IdentityModel.Tokens;
 14using CoreWCF.Security.Tokens;
 15
 16namespace CoreWCF.Security
 17{
 18    public class ServiceCredentialsSecurityTokenManager : SecurityTokenManager, IEndpointIdentityProvider
 19    {
 7220        public ServiceCredentialsSecurityTokenManager(ServiceCredentials parent)
 21        {
 7222            ServiceCredentials = parent ?? throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(paren
 7223        }
 24
 24825        public ServiceCredentials ServiceCredentials { get; }
 26
 27        public override SecurityTokenSerializer CreateSecurityTokenSerializer(SecurityTokenVersion version)
 28        {
 7629            if (version == null)
 30            {
 031                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(version));
 32            }
 7633            if (version is MessageSecurityTokenVersion wsVersion)
 34            {
 7635                SamlSerializer samlSerializer = null;
 36                //TODO this will be implemented when we add WS-Federation support
 37                //if (parent.IssuedTokenAuthentication != null)
 38                //    samlSerializer = parent.IssuedTokenAuthentication.SamlSerializer;
 39                //else
 40                //    samlSerializer = new SamlSerializer();
 41
 7642                return new WSSecurityTokenSerializer(wsVersion.SecurityVersion, wsVersion.TrustVersion, wsVersion.Secure
 43            }
 44            else
 45            {
 046                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException(SR.Format(SR.Securit
 47            }
 48        }
 49
 50        protected SecurityTokenAuthenticator CreateSecureConversationTokenAuthenticator(RecipientServiceModelSecurityTok
 51        {
 2252            SecurityBindingElement securityBindingElement = recipientRequirement.SecurityBindingElement;
 2253            if (securityBindingElement == null)
 54            {
 055                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument(SR.Format(SR.TokenAuthenticatorRequiresSecu
 56            }
 57
 2258            bool flag = !recipientRequirement.SupportSecurityContextCancellation;
 2259            LocalServiceSecuritySettings localServiceSettings = securityBindingElement.LocalServiceSettings;
 2260            IMessageFilterTable<EndpointAddress> propertyOrDefault = recipientRequirement.GetPropertyOrDefault<IMessageF
 2261            if (!flag)
 62            {
 2263                sctResolver = (SecurityTokenResolver)new SecurityContextSecurityTokenResolver(int.MaxValue, false);
 2264                return (SecurityTokenAuthenticator)new SecuritySessionSecurityTokenAuthenticator()
 2265                {
 2266                    BootstrapSecurityBindingElement = SecurityUtils.GetIssuerSecurityBindingElement((ServiceModelSecurit
 2267                    IssuedSecurityTokenParameters = recipientRequirement.GetProperty<SecurityTokenParameters>(ServiceMod
 2268                    IssuedTokenCache = (ISecurityContextSecurityTokenCache)sctResolver,
 2269                    IssuerBindingContext = recipientRequirement.GetProperty<BindingContext>(ServiceModelSecurityTokenReq
 2270                    KeyEntropyMode = securityBindingElement.KeyEntropyMode,
 2271                    ListenUri = recipientRequirement.ListenUri,
 2272                    SecurityAlgorithmSuite = recipientRequirement.SecurityAlgorithmSuite,
 2273                    SessionTokenLifetime = TimeSpan.MaxValue,
 2274                    KeyRenewalInterval = securityBindingElement.LocalServiceSettings.SessionKeyRenewalInterval,
 2275                    StandardsManager = SecurityUtils.CreateSecurityStandardsManager((SecurityTokenRequirement)recipientR
 2276                    EndpointFilterTable = propertyOrDefault,
 2277                    MaximumConcurrentNegotiations = localServiceSettings.MaxStatefulNegotiations,
 2278                    NegotiationTimeout = localServiceSettings.NegotiationTimeout,
 2279                    PreserveBootstrapTokens = preserveBootstrapTokens
 2280                };
 81            }
 082            throw new NotImplementedException();
 83            /*
 84            sctResolver = (SecurityTokenResolver)new SecurityContextSecurityTokenResolver(localServiceSettings.MaxCached
 85            AcceleratedTokenAuthenticator tokenAuthenticator = new AcceleratedTokenAuthenticator();
 86            tokenAuthenticator.BootstrapSecurityBindingElement = SecurityUtils.GetIssuerSecurityBindingElement((ServiceM
 87            tokenAuthenticator.KeyEntropyMode = securityBindingElement.KeyEntropyMode;
 88            tokenAuthenticator.EncryptStateInServiceToken = true;
 89            tokenAuthenticator.IssuedSecurityTokenParameters = recipientRequirement.GetProperty<SecurityTokenParameters>
 90            tokenAuthenticator.IssuedTokenCache = (ISecurityContextSecurityTokenCache)sctResolver;
 91            tokenAuthenticator.IssuerBindingContext = recipientRequirement.GetProperty<BindingContext>(ServiceModelSecur
 92            tokenAuthenticator.ListenUri = recipientRequirement.ListenUri;
 93            tokenAuthenticator.SecurityAlgorithmSuite = recipientRequirement.SecurityAlgorithmSuite;
 94            tokenAuthenticator.StandardsManager = SecurityUtils.CreateSecurityStandardsManager((SecurityTokenRequirement
 95            tokenAuthenticator.SecurityStateEncoder = this.parent.SecureConversationAuthentication.SecurityStateEncoder;
 96            tokenAuthenticator.KnownTypes = (IList<System.Type>)this.parent.SecureConversationAuthentication.SecurityCon
 97            tokenAuthenticator.PreserveBootstrapTokens = preserveBootstrapTokens;
 98            tokenAuthenticator.MaximumCachedNegotiationState = localServiceSettings.MaxStatefulNegotiations;
 99            tokenAuthenticator.NegotiationTimeout = localServiceSettings.NegotiationTimeout;
 100            tokenAuthenticator.ServiceTokenLifetime = localServiceSettings.IssuedCookieLifetime;
 101            tokenAuthenticator.MaximumConcurrentNegotiations = localServiceSettings.MaxStatefulNegotiations;
 102           // tokenAuthenticator.AuditLogLocation = recipientRequirement.AuditLogLocation;
 103           // tokenAuthenticator.SuppressAuditFailure = recipientRequirement.SuppressAuditFailure;
 104           // tokenAuthenticator.MessageAuthenticationAuditLevel = recipientRequirement.MessageAuthenticationAuditLevel;
 105            tokenAuthenticator.EndpointFilterTable = propertyOrDefault;
 106            return (SecurityTokenAuthenticator)tokenAuthenticator;*/
 107
 108        }
 109
 110        private SecurityTokenAuthenticator CreateSpnegoSecurityTokenAuthenticator(RecipientServiceModelSecurityTokenRequ
 111        {
 112
 1113            SecurityBindingElement securityBindingElement = recipientRequirement.SecurityBindingElement;
 1114            if (securityBindingElement == null)
 115            {
 0116                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument(SR.Format(SR.TokenAuthenticatorRequiresSecu
 117            }
 1118            bool isCookieMode = !recipientRequirement.SupportSecurityContextCancellation;
 1119            LocalServiceSecuritySettings localServiceSettings = securityBindingElement.LocalServiceSettings;
 1120            sctResolver = new SecurityContextSecurityTokenResolver(localServiceSettings.MaxCachedCookies, true);
 1121            recipientRequirement.TryGetProperty<ExtendedProtectionPolicy>(ServiceModelSecurityTokenRequirement.ExtendedP
 122
 1123            SpnegoTokenAuthenticator authenticator = new SpnegoTokenAuthenticator
 1124            {
 1125                ExtendedProtectionPolicy = null,
 1126                AllowUnauthenticatedCallers = ServiceCredentials.WindowsAuthentication.AllowAnonymousLogons,
 1127                ExtractGroupsForWindowsAccounts = ServiceCredentials.WindowsAuthentication.IncludeWindowsGroups,
 1128                IsClientAnonymous = false,
 1129                EncryptStateInServiceToken = isCookieMode,
 1130                IssuedSecurityTokenParameters = recipientRequirement.GetProperty<SecurityTokenParameters>(ServiceModelSe
 1131                IssuedTokenCache = (ISecurityContextSecurityTokenCache)sctResolver,
 1132                IssuerBindingContext = recipientRequirement.GetProperty<BindingContext>(ServiceModelSecurityTokenRequire
 1133                ListenUri = recipientRequirement.ListenUri,
 1134                SecurityAlgorithmSuite = recipientRequirement.SecurityAlgorithmSuite,
 1135                StandardsManager = SecurityUtils.CreateSecurityStandardsManager(recipientRequirement, this),
 1136                SecurityStateEncoder = ServiceCredentials.SecureConversationAuthentication.SecurityStateEncoder,
 1137                KnownTypes = ServiceCredentials.SecureConversationAuthentication.SecurityContextClaimTypes,
 1138                LdapSettings = ServiceCredentials.WindowsAuthentication.LdapSetting
 1139            };
 140            // if the SPNEGO is being done in mixed-mode, the nego blobs are from an anonymous client and so there size 
 1141            if (securityBindingElement is TransportSecurityBindingElement)
 142            {
 1143                authenticator.MaxMessageSize = SecurityUtils.GetMaxNegotiationBufferSize(authenticator.IssuerBindingCont
 144            }
 145
 146            // local security quotas
 1147            authenticator.MaximumCachedNegotiationState = localServiceSettings.MaxStatefulNegotiations;
 1148            authenticator.NegotiationTimeout = localServiceSettings.NegotiationTimeout;
 1149            authenticator.ServiceTokenLifetime = localServiceSettings.IssuedCookieLifetime;
 1150            authenticator.MaximumConcurrentNegotiations = localServiceSettings.MaxStatefulNegotiations;
 151
 152            // audit settings
 153            //authenticator.AuditLogLocation = recipientRequirement.AuditLogLocation;
 154            //authenticator.SuppressAuditFailure = recipientRequirement.SuppressAuditFailure;
 155            //authenticator.MessageAuthenticationAuditLevel = recipientRequirement.MessageAuthenticationAuditLevel;
 1156            return authenticator;
 157        }
 158
 159        private SecurityTokenAuthenticator CreateTlsnegoClientX509TokenAuthenticator(RecipientServiceModelSecurityTokenR
 160        {
 161            //throw new PlatformNotSupportedException("TlsnegoClientX509Token");
 0162            RecipientServiceModelSecurityTokenRequirement clientX509Requirement = new RecipientServiceModelSecurityToken
 0163            {
 0164                TokenType = SecurityTokenTypes.X509Certificate,
 0165                KeyUsage = SecurityKeyUsage.Signature,
 0166                ListenUri = recipientRequirement.ListenUri,
 0167                KeyType = SecurityKeyType.AsymmetricKey,
 0168                SecurityBindingElement = recipientRequirement.SecurityBindingElement
 0169            };
 0170            return CreateSecurityTokenAuthenticator(clientX509Requirement, out _);
 171        }
 172
 173        private SecurityTokenProvider CreateTlsnegoServerX509TokenProvider(RecipientServiceModelSecurityTokenRequirement
 174        {
 175            //throw new PlatformNotSupportedException("TlsnegoServerX509Token");
 0176            RecipientServiceModelSecurityTokenRequirement serverX509Requirement = new RecipientServiceModelSecurityToken
 0177            {
 0178                TokenType = SecurityTokenTypes.X509Certificate,
 0179                KeyUsage = SecurityKeyUsage.Exchange,
 0180                ListenUri = recipientRequirement.ListenUri,
 0181                KeyType = SecurityKeyType.AsymmetricKey,
 0182                SecurityBindingElement = recipientRequirement.SecurityBindingElement
 0183            };
 0184            return CreateSecurityTokenProvider(serverX509Requirement);
 185        }
 186
 187        private SecurityTokenAuthenticator CreateTlsnegoSecurityTokenAuthenticator(RecipientServiceModelSecurityTokenReq
 188        {
 0189            throw new PlatformNotSupportedException("TlsnegoSecurityToken");
 190            /*
 191            SecurityBindingElement securityBindingElement = recipientRequirement.SecurityBindingElement;
 192            if (securityBindingElement == null)
 193            {
 194                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument(SR.Format(SR.TokenAuthenticatorRequiresSecu
 195            }
 196            bool isCookieMode = !recipientRequirement.SupportSecurityContextCancellation;
 197            LocalServiceSecuritySettings localServiceSettings = securityBindingElement.LocalServiceSettings;
 198            sctResolver = new SecurityContextSecurityTokenResolver(localServiceSettings.MaxCachedCookies, true);
 199
 200            TlsnegoTokenAuthenticator authenticator = new TlsnegoTokenAuthenticator();
 201            authenticator.IsClientAnonymous = !requireClientCertificate;
 202            if (requireClientCertificate)
 203            {
 204                authenticator.ClientTokenAuthenticator = this.CreateTlsnegoClientX509TokenAuthenticator(recipientRequire
 205                authenticator.MapCertificateToWindowsAccount = this.ServiceCredentials.ClientCertificate.Authentication.
 206            }
 207            authenticator.EncryptStateInServiceToken = isCookieMode;
 208            authenticator.IssuedSecurityTokenParameters = recipientRequirement.GetProperty<SecurityTokenParameters>(Serv
 209            authenticator.IssuedTokenCache = (ISecurityContextSecurityTokenCache)sctResolver;
 210            authenticator.IssuerBindingContext = recipientRequirement.GetProperty<BindingContext>(ServiceModelSecurityTo
 211            authenticator.ListenUri = recipientRequirement.ListenUri;
 212            authenticator.SecurityAlgorithmSuite = recipientRequirement.SecurityAlgorithmSuite;
 213            authenticator.StandardsManager = SecurityUtils.CreateSecurityStandardsManager(recipientRequirement, this);
 214            authenticator.SecurityStateEncoder = parent.SecureConversationAuthentication.SecurityStateEncoder;
 215            authenticator.KnownTypes = parent.SecureConversationAuthentication.SecurityContextClaimTypes;
 216            authenticator.ServerTokenProvider = CreateTlsnegoServerX509TokenProvider(recipientRequirement);
 217            // local security quotas
 218            authenticator.MaximumCachedNegotiationState = localServiceSettings.MaxStatefulNegotiations;
 219            authenticator.NegotiationTimeout = localServiceSettings.NegotiationTimeout;
 220            authenticator.ServiceTokenLifetime = localServiceSettings.IssuedCookieLifetime;
 221            authenticator.MaximumConcurrentNegotiations = localServiceSettings.MaxStatefulNegotiations;
 222            // if the TLSNEGO is being done in mixed-mode, the nego blobs are from an anonymous client and so there size
 223            if (securityBindingElement is TransportSecurityBindingElement)
 224            {
 225                authenticator.MaxMessageSize = SecurityUtils.GetMaxNegotiationBufferSize(authenticator.IssuerBindingCont
 226            }
 227            // audit settings
 228           // authenticator.AuditLogLocation = recipientRequirement.AuditLogLocation;
 229           // authenticator.SuppressAuditFailure = recipientRequirement.SuppressAuditFailure;
 230           // authenticator.MessageAuthenticationAuditLevel = recipientRequirement.MessageAuthenticationAuditLevel;
 231            return authenticator;*/
 232        }
 233
 234        private X509SecurityTokenAuthenticator CreateClientX509TokenAuthenticator()
 235        {
 16236            X509ClientCertificateAuthentication authentication = ServiceCredentials.ClientCertificate.Authentication;
 16237            return new X509SecurityTokenAuthenticator(authentication.GetCertificateValidator(), authentication.MapClient
 238        }
 239
 240        private SamlSecurityTokenAuthenticator CreateSamlTokenAuthenticator(RecipientServiceModelSecurityTokenRequiremen
 241        {
 0242            if (recipientRequirement == null)
 0243                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(recipientRequirement));
 244
 0245            Collection<SecurityToken> outOfBandTokens = new Collection<SecurityToken>();
 0246            var parent = ServiceCredentials;
 0247            if (parent.ServiceCertificate.Certificate != null)
 248            {
 0249                outOfBandTokens.Add(new X509SecurityToken(parent.ServiceCertificate.Certificate));
 250            }
 0251            List<SecurityTokenAuthenticator> supportingAuthenticators = new List<SecurityTokenAuthenticator>();
 0252            if ((parent.IssuedTokenAuthentication.KnownCertificates != null) && (parent.IssuedTokenAuthentication.KnownC
 253            {
 0254                for (int i = 0; i < parent.IssuedTokenAuthentication.KnownCertificates.Count; ++i)
 255                {
 0256                    outOfBandTokens.Add(new X509SecurityToken(parent.IssuedTokenAuthentication.KnownCertificates[i]));
 257                }
 258            }
 259
 0260            X509CertificateValidator validator = parent.IssuedTokenAuthentication.GetCertificateValidator();
 0261            supportingAuthenticators.Add(new X509SecurityTokenAuthenticator(validator));
 262
 0263            if (parent.IssuedTokenAuthentication.AllowUntrustedRsaIssuers)
 264            {
 0265                supportingAuthenticators.Add(new RsaSecurityTokenAuthenticator());
 266            }
 267
 0268            outOfBandTokenResolver = (outOfBandTokens.Count > 0) ? SecurityTokenResolver.CreateDefaultSecurityTokenResol
 269
 270            SamlSecurityTokenAuthenticator ssta;
 271
 0272            if ((recipientRequirement.SecurityBindingElement == null) || (recipientRequirement.SecurityBindingElement.Lo
 273            {
 0274                ssta = new SamlSecurityTokenAuthenticator(supportingAuthenticators);
 275            }
 276            else
 277            {
 0278                ssta = new SamlSecurityTokenAuthenticator(supportingAuthenticators, recipientRequirement.SecurityBinding
 279            }
 280
 281            // set audience uri restrictions
 0282            ssta.AudienceUriMode = parent.IssuedTokenAuthentication.AudienceUriMode;
 0283            IList<string> allowedAudienceUris = ssta.AllowedAudienceUris;
 0284            if (parent.IssuedTokenAuthentication.AllowedAudienceUris != null)
 285            {
 0286                for (int i = 0; i < parent.IssuedTokenAuthentication.AllowedAudienceUris.Count; i++)
 0287                    allowedAudienceUris.Add(parent.IssuedTokenAuthentication.AllowedAudienceUris[i]);
 288            }
 289
 0290            if (recipientRequirement.ListenUri != null)
 291            {
 0292               allowedAudienceUris.Add(recipientRequirement.ListenUri.AbsoluteUri);
 293            }
 294
 0295            return ssta;
 296        }
 297
 298        private X509SecurityTokenProvider CreateServerX509TokenProvider()
 299        {
 5300            if (ServiceCredentials.ServiceCertificate.Certificate == null)
 301            {
 0302                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.ServiceCertif
 303            }
 5304            SecurityUtils.EnsureCertificateCanDoKeyExchange(ServiceCredentials.ServiceCertificate.Certificate);
 5305            return new ServiceX509SecurityTokenProvider(ServiceCredentials.ServiceCertificate.Certificate);
 306        }
 307
 308        protected bool IsIssuedSecurityTokenRequirement(SecurityTokenRequirement requirement)
 309        {
 0310            return (requirement != null && requirement.Properties.ContainsKey(ServiceModelSecurityTokenRequirement.Issue
 311        }
 312
 313        public override SecurityTokenAuthenticator CreateSecurityTokenAuthenticator(SecurityTokenRequirement tokenRequir
 314        {
 54315            if (tokenRequirement == null)
 316            {
 0317                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(tokenRequirement));
 318            }
 54319            string tokenType = tokenRequirement.TokenType;
 54320            outOfBandTokenResolver = null;
 54321            SecurityTokenAuthenticator result = null;
 54322            if (tokenRequirement is InitiatorServiceModelSecurityTokenRequirement)
 323            {
 324                // this is the uncorrelated duplex case in which the server is asking for
 325                // an authenticator to validate its provisioned client certificate
 0326                if (tokenType == SecurityTokenTypes.X509Certificate && tokenRequirement.KeyUsage == SecurityKeyUsage.Exc
 327                {
 0328                    return new X509SecurityTokenAuthenticator(X509CertificateValidator.None, false);
 329                }
 330            }
 331
 54332            if (!(tokenRequirement is RecipientServiceModelSecurityTokenRequirement recipientRequirement))
 333            {
 0334                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException(SR.Format(SR.Securit
 335            }
 54336            if (tokenType == SecurityTokenTypes.X509Certificate)
 337            {
 16338                result = CreateClientX509TokenAuthenticator();
 339            }
 38340            else if (tokenType == SecurityTokenTypes.Kerberos)
 341            {
 0342                throw new PlatformNotSupportedException("KerberosSecurityTokenAuthenticator");
 343                //result = new KerberosSecurityTokenAuthenticatorWrapper(
 344                //    new KerberosSecurityTokenAuthenticator(parent.WindowsAuthentication.IncludeWindowsGroups));
 345            }
 38346            else if (tokenType == SecurityTokenTypes.UserName)
 347            {
 15348                if (ServiceCredentials.UserNameAuthentication.UserNamePasswordValidationMode == UserNamePasswordValidati
 349                {
 0350                    throw new PlatformNotSupportedException("UserNamePasswordValidationMode.Windows");
 351                    //if (parent.UserNameAuthentication.CacheLogonTokens)
 352                    //{
 353                    //    result = new WindowsUserNameCachingSecurityTokenAuthenticator(parent.UserNameAuthentication.In
 354                    //        parent.UserNameAuthentication.MaxCachedLogonTokens, parent.UserNameAuthentication.CachedLo
 355                    //}
 356                    //else
 357                    //{
 358                    //    result = new WindowsUserNameSecurityTokenAuthenticator(parent.UserNameAuthentication.IncludeWi
 359                    //}
 360                }
 361                else
 362                {
 15363                    result = new CustomUserNameSecurityTokenAuthenticator(ServiceCredentials.UserNameAuthentication.GetU
 364                }
 365            }
 23366            else if (tokenType == SecurityTokenTypes.Rsa)
 367            {
 0368                result = new RsaSecurityTokenAuthenticator();
 369            }
 23370            else if (tokenType == ServiceModelSecurityTokenTypes.AnonymousSslnego)
 371            {
 0372                throw new NotSupportedException();
 373              //  result = CreateTlsnegoSecurityTokenAuthenticator(recipientRequirement, false, out outOfBandTokenResolv
 374            }
 23375            else if (tokenType == ServiceModelSecurityTokenTypes.MutualSslnego)
 376            {
 0377                throw new NotSupportedException();
 378                //  result = CreateTlsnegoSecurityTokenAuthenticator(recipientRequirement, true, out outOfBandTokenResol
 379            }
 23380            else if (tokenType == ServiceModelSecurityTokenTypes.Spnego)
 381            {
 1382                result = CreateSpnegoSecurityTokenAuthenticator(recipientRequirement, out outOfBandTokenResolver);
 383            }
 22384            else if (tokenType == ServiceModelSecurityTokenTypes.SecureConversation)
 385            {
 22386                result = CreateSecureConversationTokenAuthenticator(recipientRequirement, false, out outOfBandTokenResol
 387            }
 0388            else if ((tokenType == SecurityTokenTypes.Saml)
 0389                || (tokenType == SecurityXXX2005Strings.SamlTokenType)
 0390                || (tokenType == SecurityJan2004Strings.SamlUri)
 0391                || (tokenType == null && IsIssuedSecurityTokenRequirement(recipientRequirement)))
 392            {
 0393                result = CreateSamlTokenAuthenticator(recipientRequirement, out outOfBandTokenResolver);
 394            }
 395
 54396            if (result == null)
 397            {
 0398                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException(SR.Format(SR.Securit
 399            }
 400
 54401            return result;
 402        }
 403
 404        private SecurityTokenProvider CreateLocalSecurityTokenProvider(RecipientServiceModelSecurityTokenRequirement rec
 405        {
 17406            string tokenType = recipientRequirement.TokenType;
 17407            SecurityTokenProvider result = null;
 17408            if (tokenType == SecurityTokenTypes.X509Certificate)
 409            {
 5410                result = CreateServerX509TokenProvider();
 411            }
 12412            else if (tokenType == ServiceModelSecurityTokenTypes.SspiCredential)
 413            {
 414                // if Transport Security, AuthenticationSchemes.Basic will look at parent.UserNameAuthentication setting
 12415                bool authenticationSchemeIdentified = recipientRequirement.TryGetProperty<AuthenticationSchemes>(Service
 12416                if (authenticationSchemeIdentified &&
 12417                    authenticationScheme.IsSet(AuthenticationSchemes.Basic) &&
 12418                    authenticationScheme.IsNotSet(AuthenticationSchemes.Digest | AuthenticationSchemes.Ntlm | Authentica
 419                {
 420                    // create security token provider even when basic and Anonymous are enabled.
 0421                    result = new SspiSecurityTokenProvider(null, ServiceCredentials.UserNameAuthentication.IncludeWindow
 422                }
 423                else
 424                {
 12425                    if (authenticationSchemeIdentified &&
 12426                       authenticationScheme.IsSet(AuthenticationSchemes.Basic) &&
 12427                       ServiceCredentials.WindowsAuthentication.IncludeWindowsGroups != ServiceCredentials.UserNameAuthe
 428                    {
 429                        // Ensure there are no inconsistencies when Basic and (Digest and/or Ntlm and/or Negotiate) are 
 0430                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException(SR.Format(SR
 0431                            (AuthenticationSchemes)authenticationScheme - AuthenticationSchemes.Basic,
 0432                            ServiceCredentials.UserNameAuthentication.IncludeWindowsGroups,
 0433                            ServiceCredentials.WindowsAuthentication.IncludeWindowsGroups)));
 434                    }
 435
 12436                    result = new SspiSecurityTokenProvider(null, ServiceCredentials.WindowsAuthentication.IncludeWindows
 437                }
 438            }
 17439            return result;
 440        }
 441
 442        private SecurityTokenProvider CreateUncorrelatedDuplexSecurityTokenProvider(InitiatorServiceModelSecurityTokenRe
 443        {
 0444            string tokenType = initiatorRequirement.TokenType;
 0445            SecurityTokenProvider result = null;
 0446            if (tokenType == SecurityTokenTypes.X509Certificate)
 447            {
 0448                SecurityKeyUsage keyUsage = initiatorRequirement.KeyUsage;
 0449                if (keyUsage == SecurityKeyUsage.Exchange)
 450                {
 0451                    if (ServiceCredentials.ClientCertificate.Certificate == null)
 452                    {
 0453                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.Clien
 454                    }
 455
 0456                    result = new X509SecurityTokenProvider(ServiceCredentials.ClientCertificate.Certificate);
 457                }
 458                else
 459                {
 460                    // this is a request for the server's own cert for signing
 0461                    result = CreateServerX509TokenProvider();
 462                }
 463            }
 0464            return result;
 465        }
 466
 467        public override SecurityTokenProvider CreateSecurityTokenProvider(SecurityTokenRequirement requirement)
 468        {
 17469            if (requirement == null)
 470            {
 0471                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(requirement));
 472            }
 473
 17474            SecurityTokenProvider result = null;
 17475            if (requirement is RecipientServiceModelSecurityTokenRequirement recipientRequirement)
 476            {
 17477                result = CreateLocalSecurityTokenProvider(recipientRequirement);
 478            }
 0479            else if (requirement is InitiatorServiceModelSecurityTokenRequirement)
 480            {
 0481                result = CreateUncorrelatedDuplexSecurityTokenProvider((InitiatorServiceModelSecurityTokenRequirement)re
 482            }
 483
 17484            if (result == null)
 485            {
 0486                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException(SR.Format(SR.Securit
 487            }
 17488            return result;
 489        }
 490
 491        public virtual EndpointIdentity GetIdentityOfSelf(SecurityTokenRequirement tokenRequirement)
 492        {
 0493            if (tokenRequirement == null)
 494            {
 0495                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(tokenRequirement));
 496            }
 0497            if (tokenRequirement is RecipientServiceModelSecurityTokenRequirement)
 498            {
 0499                string tokenType = tokenRequirement.TokenType;
 0500                if (tokenType == SecurityTokenTypes.X509Certificate
 0501                    || tokenType == ServiceModelSecurityTokenTypes.AnonymousSslnego
 0502                    || tokenType == ServiceModelSecurityTokenTypes.MutualSslnego)
 503                {
 0504                    if (ServiceCredentials.ServiceCertificate.Certificate != null)
 505                    {
 0506                        return EndpointIdentity.CreateX509CertificateIdentity(ServiceCredentials.ServiceCertificate.Cert
 507                    }
 508                }
 0509                else if (tokenType == SecurityTokenTypes.Kerberos || tokenType == ServiceModelSecurityTokenTypes.Spnego)
 510                {
 511                    // TODO: Add WindowsIdentity support here as it looks like it is doable
 0512                    throw new PlatformNotSupportedException("WindowsIdentity");
 513                    //return SecurityUtils.CreateWindowsIdentity();
 514                }
 0515                else if (tokenType == ServiceModelSecurityTokenTypes.SecureConversation)
 516                {
 0517                    throw new PlatformNotSupportedException("SecureConversation");
 518                    //SecurityBindingElement securityBindingElement = ((RecipientServiceModelSecurityTokenRequirement)to
 519                    //if (securityBindingElement != null)
 520                    //{
 521                    //    if (securityBindingElement == null || securityBindingElement is TransportSecurityBindingElemen
 522                    //    {
 523                    //        return null;
 524                    //    }
 525                    //    SecurityTokenParameters bootstrapProtectionParameters = (securityBindingElement is SymmetricSe
 526                    //    SecurityTokenRequirement bootstrapRequirement = new RecipientServiceModelSecurityTokenRequirem
 527                    //    bootstrapProtectionParameters.InitializeSecurityTokenRequirement(bootstrapRequirement);
 528                    //    return GetIdentityOfSelf(bootstrapRequirement);
 529                    //}
 530                }
 531            }
 0532            return null;
 533        }
 534    }
 535}

Methods/Properties

.ctor(CoreWCF.Description.ServiceCredentials)
ServiceCredentials()
CreateSecurityTokenSerializer(CoreWCF.IdentityModel.Selectors.SecurityTokenVersion)
CreateSecureConversationTokenAuthenticator(CoreWCF.Security.Tokens.RecipientServiceModelSecurityTokenRequirement,System.Boolean,CoreWCF.IdentityModel.Selectors.SecurityTokenResolver&)
CreateSpnegoSecurityTokenAuthenticator(CoreWCF.Security.Tokens.RecipientServiceModelSecurityTokenRequirement,CoreWCF.IdentityModel.Selectors.SecurityTokenResolver&)
CreateTlsnegoClientX509TokenAuthenticator(CoreWCF.Security.Tokens.RecipientServiceModelSecurityTokenRequirement)
CreateTlsnegoServerX509TokenProvider(CoreWCF.Security.Tokens.RecipientServiceModelSecurityTokenRequirement)
CreateTlsnegoSecurityTokenAuthenticator(CoreWCF.Security.Tokens.RecipientServiceModelSecurityTokenRequirement,System.Boolean,CoreWCF.IdentityModel.Selectors.SecurityTokenResolver&)
CreateClientX509TokenAuthenticator()
CreateSamlTokenAuthenticator(CoreWCF.Security.Tokens.RecipientServiceModelSecurityTokenRequirement,CoreWCF.IdentityModel.Selectors.SecurityTokenResolver&)
CreateServerX509TokenProvider()
IsIssuedSecurityTokenRequirement(CoreWCF.IdentityModel.Selectors.SecurityTokenRequirement)
CreateSecurityTokenAuthenticator(CoreWCF.IdentityModel.Selectors.SecurityTokenRequirement,CoreWCF.IdentityModel.Selectors.SecurityTokenResolver&)
CreateLocalSecurityTokenProvider(CoreWCF.Security.Tokens.RecipientServiceModelSecurityTokenRequirement)
CreateUncorrelatedDuplexSecurityTokenProvider(CoreWCF.Security.Tokens.InitiatorServiceModelSecurityTokenRequirement)
CreateSecurityTokenProvider(CoreWCF.IdentityModel.Selectors.SecurityTokenRequirement)
GetIdentityOfSelf(CoreWCF.IdentityModel.Selectors.SecurityTokenRequirement)