< Summary - CoreWCF Coverage — PR #1766

Information
Class: CoreWCF.Security.Tokens.SecurityContextSecurityTokenHelper
Assembly: CoreWCF.Primitives
File(s): /home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/IdentityModel/Tokens/SecurityContextSecurityTokenHelper.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 46
Coverable lines: 46
Total lines: 125
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 32
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
ConvertSctToSessionToken(...)100%110%
ConvertSctToSessionToken(...)0%22220%
ConvertSessionTokenToSecurityContextSecurityToken(...)0%10100%

File(s)

/home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/IdentityModel/Tokens/SecurityContextSecurityTokenHelper.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.Security.Claims;
 7using CoreWCF.IdentityModel.Policy;
 8using CoreWCF.IdentityModel.Tokens;
 9
 10namespace CoreWCF.Security.Tokens
 11{
 12    internal static class SecurityContextSecurityTokenHelper
 13    {
 14        public static SessionSecurityToken ConvertSctToSessionToken(SecurityContextSecurityToken sct)
 15        {
 016            return ConvertSctToSessionToken(sct, SecureConversationVersion.Default);
 17        }
 18
 19        public static SessionSecurityToken ConvertSctToSessionToken(SecurityContextSecurityToken sct, SecureConversation
 20        {
 021            string endpointId = String.Empty;
 22
 023            for (int i = 0; i < sct.AuthorizationPolicies.Count; ++i)
 24            {
 025                EndpointAuthorizationPolicy epAuthPolicy = sct.AuthorizationPolicies[i] as EndpointAuthorizationPolicy;
 026                if (epAuthPolicy != null)
 27                {
 028                    endpointId = epAuthPolicy.EndpointId;
 029                    break;
 30                }
 31            }
 32
 033            SctAuthorizationPolicy sctAuthPolicy = null;
 034            for (int i = 0; i < sct.AuthorizationPolicies.Count; i++)
 35            {
 036                IAuthorizationPolicy authPolicy = sct.AuthorizationPolicies[i];
 37
 38                // The WCF SCT will have a SctAuthorizationPolicy that wraps the Primary Identity
 39                // of the bootstrap token. This is required for SCT renewal scenarios. Write the
 40                // SctAuthorizationPolicy if one is available.
 041                sctAuthPolicy = authPolicy as SctAuthorizationPolicy;
 042                if (sctAuthPolicy != null)
 43                {
 44                    break;
 45                }
 46            }
 47
 048            ClaimsPrincipal claimsPrincipal = null;
 49            // these can be empty in transport security
 050            if (sct.AuthorizationPolicies != null && sct.AuthorizationPolicies.Count > 0)
 51            {
 052                AuthorizationPolicy ap = null;
 053                for (int i = 0; i < sct.AuthorizationPolicies.Count; ++i)
 54                {
 055                    ap = sct.AuthorizationPolicies[i] as AuthorizationPolicy;
 056                    if (ap != null)
 57                    {
 58                        // We should have exactly one IAuthorizationPolicy of type AuthorizationPolicy.
 59                        break;
 60                    }
 61                }
 062                if (ap != null)
 63                {
 064                    if (ap.IdentityCollection != null)
 65                    {
 066                        claimsPrincipal = new ClaimsPrincipal(ap.IdentityCollection);
 67                    }
 68                }
 69            }
 70
 071            if (claimsPrincipal == null)
 72            {
 73                // When _securityContextTokenWrapper is true, this implies WCF.
 74                // Authpolicies not found occurs when the SCT represents a bootstrap nego that is used obtain a key
 75                // for the outer or actual SCT {unfortunate but true and we haven't found a way to distinguish this othe
 76                // So return an empty ClaimsPrincipal so that when written on wire in cookie mode we DO NOT write an emp
 77                // If we did, then when the actual bootstrap token, such as a SAML token arrives, we will add the bootst
 78                // and end up with multiple, one of them anonymous.
 79                //
 080                claimsPrincipal = new ClaimsPrincipal();
 81            }
 82
 083            return new SessionSecurityToken(claimsPrincipal, sct.ContextId, sct.Id, String.Empty, sct.GetKeyBytes(), end
 84        }
 85
 86        public static SecurityContextSecurityToken ConvertSessionTokenToSecurityContextSecurityToken(SessionSecurityToke
 87        {
 088            if (token == null)
 89            {
 090                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(token));
 91            }
 92
 093            List<IAuthorizationPolicy> policies = new List<IAuthorizationPolicy>();
 094            if (token.SctAuthorizationPolicy != null)
 95            {
 096                policies.Add(token.SctAuthorizationPolicy);
 97            }
 98
 099            if (token.ClaimsPrincipal != null && token.ClaimsPrincipal.Identities != null)
 100            {
 0101                policies.Add(new AuthorizationPolicy(token.ClaimsPrincipal.Identities));
 102            }
 103
 0104            byte[] key = null;
 0105            SymmetricSecurityKey symmetricKey = token.SecurityKeys[0] as SymmetricSecurityKey;
 0106            if (symmetricKey != null)
 107            {
 0108                key = symmetricKey.GetSymmetricKey();
 109            }
 110
 0111            SecurityContextSecurityToken sct = new SecurityContextSecurityToken(
 0112                token.ContextId,
 0113                 token.Id,
 0114                 key,
 0115                 token.ValidFrom,
 0116                 token.ValidTo,
 0117                 token.KeyGeneration,
 0118                 token.KeyEffectiveTime,
 0119                 token.KeyExpirationTime,
 0120                 policies.AsReadOnly());
 121
 0122            return sct;
 123        }
 124    }
 125}