< Summary - CoreWCF Coverage — PR #1766

Information
Class: CoreWCF.IdentityModel.Tokens.SamlTokenValidationParameters
Assembly: CoreWCF.Primitives
File(s): /home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/IdentityModel/Tokens/SamlTokenValidationParameters.cs
Line coverage
82%
Covered lines: 62
Uncovered lines: 13
Coverable lines: 75
Total lines: 182
Line coverage: 82.6%
Branch coverage
57%
Covered branches: 31
Total branches: 54
Branch coverage: 57.4%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor()100%11100%
ConvertToTokenValidationParameters(...)62.5%8886.95%
IssuerSigningKeyValidator(...)50%6681.81%
ResolveIssuerSigningKey()55.55%363672%
IssuerValidate(...)50%2285.71%
AudienceValidator(...)100%22100%
GetSecurityTokenHandler(...)100%11100%

File(s)

/home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/IdentityModel/Tokens/SamlTokenValidationParameters.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.Linq;
 7using System.Security.Cryptography.X509Certificates;
 8using CoreWCF.IdentityModel.Selectors;
 9using Microsoft.IdentityModel.Tokens;
 10using MsIdentityTokens = Microsoft.IdentityModel.Tokens;
 11
 12namespace CoreWCF.IdentityModel.Tokens
 13{
 14    internal class SamlTokenValidationParameters
 15    {
 16        private const string PROPERTY_BAG_ORIGIN = "CoreWCF.IdentityModel.Tokens.SamlTokenValidationParameters.";
 17        private const string SAML_SECURITY_TOKEN = PROPERTY_BAG_ORIGIN + "SamlSecurityToken";
 18        private const string SAML_SECURITY_TOKEN_REQ = PROPERTY_BAG_ORIGIN + "SamlSecurityTokenRequirement";
 19        private const string SECURITY_TOKEN_HANDLER_CONFIG = PROPERTY_BAG_ORIGIN + "SecurityTokenHandlerConfiguration";
 20
 4821        public SamlTokenValidationParameters()
 22        {
 4823        }
 24
 25        internal TokenValidationParameters ConvertToTokenValidationParameters
 26            (SecurityTokenHandlerConfiguration securityHandlerConfiguration, SecurityToken securityToken, SamlSecurityTo
 27        {
 4828            TokenValidationParameters tokenValidationParams = new TokenValidationParameters
 4829            {
 4830                PropertyBag = new Dictionary<string, object>()
 4831            };
 4832            tokenValidationParams.PropertyBag.Add(SECURITY_TOKEN_HANDLER_CONFIG, securityHandlerConfiguration);
 33
 4834            tokenValidationParams.ValidateAudience = securityTokenRequirement.ShouldEnforceAudienceRestriction
 4835                (securityHandlerConfiguration.AudienceRestriction.AudienceMode, securityToken);
 4836            tokenValidationParams.RequireAudience = tokenValidationParams.ValidateAudience;
 37
 4838            if (tokenValidationParams.ValidateAudience)
 39            {
 4740                if (securityHandlerConfiguration == null || securityHandlerConfiguration.AudienceRestriction.AllowedAudi
 41                {
 042                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.Format(SR
 43                }
 44
 4745                tokenValidationParams.PropertyBag.Add(SAML_SECURITY_TOKEN_REQ, securityTokenRequirement);
 4746                tokenValidationParams.AudienceValidator = AudienceValidator;
 47            }
 48
 49            //start of tokenreplay
 4850            if (securityHandlerConfiguration.DetectReplayedTokens)
 51            {
 052                tokenValidationParams.ValidateTokenReplay = true;
 053                tokenValidationParams.TokenReplayCache = securityHandlerConfiguration.Caches.TokenReplayCache;
 54            }
 55
 56            //start of certificate validator
 4857            tokenValidationParams.IssuerSigningKeyValidator = IssuerSigningKeyValidator;
 58            //start of Issuer validation
 4859            tokenValidationParams.IssuerValidator = IssuerValidate;
 4860            tokenValidationParams.PropertyBag.Add(SAML_SECURITY_TOKEN, securityToken);
 4861            tokenValidationParams.IssuerSigningKeyResolver = ResolveIssuerSigningKey;
 4862            tokenValidationParams.RequireSignedTokens = true;
 4863            tokenValidationParams.ClockSkew = securityHandlerConfiguration.MaxClockSkew;
 4864            return tokenValidationParams;
 65        }
 66
 67        private bool IssuerSigningKeyValidator(MsIdentityTokens.SecurityKey securityKey, MsIdentityTokens.SecurityToken 
 68        {
 3069            X509CertificateValidator validator = GetSecurityTokenHandler(validationParameters).CertificateValidator;
 3070            ICollection<Microsoft.IdentityModel.Xml.X509Data> x509Datas = null;
 3071            if (securityToken is MsIdentityTokens.Saml.SamlSecurityToken token)
 72            {
 3073                x509Datas = token.Assertion.Signature.KeyInfo.X509Data;
 74            }
 75            else
 76            {
 077                x509Datas = ((MsIdentityTokens.Saml2.Saml2SecurityToken)securityToken).Assertion.Signature.KeyInfo.X509D
 78            }
 79
 3080            if(x509Datas == null || x509Datas.Count > 1)
 81            {
 082                return false;
 83            }
 84
 3085            byte[] data = Convert.FromBase64String(x509Datas.FirstOrDefault().Certificates.FirstOrDefault());
 3086            X509Certificate2 cert = new X509Certificate2(data);
 3087            validator.Validate(cert);
 3088            return true;
 89        }
 90
 91        private IEnumerable<MsIdentityTokens.SecurityKey> ResolveIssuerSigningKey(string token, MsIdentityTokens.Securit
 92        {
 4893            SecurityToken samlToken = (SecurityToken)validationParameters.PropertyBag[SAML_SECURITY_TOKEN];
 4894            SecurityToken signingToken = null;
 95
 4896            if (samlToken is SamlSecurityToken sst)
 97            {
 4898                signingToken = sst.SigningToken;
 99            }
 0100            else if (samlToken is Saml2SecurityToken s2t)
 101            {
 0102                signingToken = s2t.SigningToken;
 103            }
 104
 48105            if (signingToken is X509SecurityToken x509Token && x509Token.Certificate != null)
 106            {
 46107                yield return new MsIdentityTokens.X509SecurityKey(x509Token.Certificate);
 7108                yield break;
 109            }
 110
 2111            ICollection<Microsoft.IdentityModel.Xml.X509Data> x509Datas = null;
 2112            if (securityToken is MsIdentityTokens.Saml.SamlSecurityToken samlSecurityToken
 2113                && samlSecurityToken.Assertion?.Signature?.KeyInfo != null)
 114            {
 2115                x509Datas = samlSecurityToken.Assertion.Signature.KeyInfo.X509Data;
 116            }
 0117            else if (securityToken is MsIdentityTokens.Saml2.Saml2SecurityToken saml2SecurityToken
 0118                && saml2SecurityToken.Assertion?.Signature?.KeyInfo != null)
 119            {
 0120                x509Datas = saml2SecurityToken.Assertion.Signature.KeyInfo.X509Data;
 121            }
 122
 2123            if (x509Datas == null)
 124            {
 0125                yield break;
 126            }
 127
 6128            foreach (Microsoft.IdentityModel.Xml.X509Data x509Data in x509Datas)
 129            {
 2130                if (x509Data?.Certificates == null)
 131                {
 132                    continue;
 133                }
 134
 6135                foreach (string base64Cert in x509Data.Certificates)
 136                {
 2137                    if (string.IsNullOrEmpty(base64Cert))
 138                    {
 139                        continue;
 140                    }
 141
 2142                    X509Certificate2 cert = new X509Certificate2(Convert.FromBase64String(base64Cert));
 2143                    yield return new MsIdentityTokens.X509SecurityKey(cert);
 144                }
 145            }
 0146        }
 147
 148        private string IssuerValidate(string issuer, MsIdentityTokens.SecurityToken securityToken, TokenValidationParame
 149        {
 32150            IssuerNameRegistry issuerNameRegistry = GetSecurityTokenHandler(validationParameters).IssuerNameRegistry;
 32151            SecurityToken samlToken = (SecurityToken)validationParameters.PropertyBag[SAML_SECURITY_TOKEN];
 32152            SecurityToken signingToken = null;
 153
 32154            if (samlToken is SamlSecurityToken)
 155            {
 32156                signingToken = ((SamlSecurityToken)samlToken).SigningToken;
 157            }
 158            else
 159            {
 0160                signingToken = ((Saml2SecurityToken)samlToken).SigningToken;
 161            }
 162
 32163            return issuerNameRegistry.GetIssuerName(signingToken, issuer);
 164        }
 165
 166        private bool AudienceValidator(IEnumerable<string> audienceUris, MsIdentityTokens.SecurityToken securityToken, T
 167        {
 39168            SamlSecurityTokenRequirement samlSecurityTokenRequirement = (SamlSecurityTokenRequirement)validationParamete
 39169            List<Uri> uris = new List<Uri>();
 162170            foreach(string audienceUri in audienceUris)
 171            {
 42172                uris.Add(new Uri(audienceUri));
 173            }
 174            //if there is error, throw.
 39175            samlSecurityTokenRequirement.ValidateAudienceRestriction(uris, GetSecurityTokenHandler(validationParameters)
 33176            return true;
 177        }
 178
 101179        private SecurityTokenHandlerConfiguration GetSecurityTokenHandler(TokenValidationParameters validationParameters
 180
 181    }
 182}