< Summary - CoreWCF Coverage — PR #1766

Information
Class: CoreWCF.ServiceSecurityContext
Assembly: CoreWCF.Primitives
File(s): /home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/ServiceSecurityContext.cs
Line coverage
52%
Covered lines: 28
Uncovered lines: 25
Coverable lines: 53
Total lines: 173
Line coverage: 52.8%
Branch coverage
43%
Covered branches: 19
Total branches: 44
Branch coverage: 43.1%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor(...)50%22100%
.ctor(...)100%11100%
.ctor(...)50%44100%
GetIdentities()100%44100%

File(s)

/home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/ServiceSecurityContext.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.Collections.Generic;
 5using System.Collections.ObjectModel;
 6using System.Security.Claims;
 7using System.Security.Principal;
 8using CoreWCF.Channels;
 9using CoreWCF.IdentityModel.Policy;
 10using CoreWCF.Security;
 11using Claim = CoreWCF.IdentityModel.Claims.Claim;
 12
 13namespace CoreWCF
 14{
 15    public class ServiceSecurityContext
 16    {
 17        private static ServiceSecurityContext s_anonymous;
 18        private AuthorizationContext _authorizationContext;
 19        private IIdentity _primaryIdentity;
 20        private Claim _identityClaim;
 21        private WindowsIdentity _windowsIdentity;
 22
 23        // Perf: delay created authorizationContext using forward chain.
 8724        public ServiceSecurityContext(ReadOnlyCollection<IAuthorizationPolicy> authorizationPolicies)
 25        {
 8726            _authorizationContext = null;
 8727            AuthorizationPolicies = authorizationPolicies ?? throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumen
 8728        }
 29
 30        public ServiceSecurityContext(AuthorizationContext authorizationContext)
 5631            : this(authorizationContext, EmptyReadOnlyCollection<IAuthorizationPolicy>.Instance)
 32        {
 5633        }
 34
 5835        public ServiceSecurityContext(AuthorizationContext authorizationContext, ReadOnlyCollection<IAuthorizationPolicy
 36        {
 5837            _authorizationContext = authorizationContext ?? throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument
 5838            AuthorizationPolicies = authorizationPolicies ?? throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumen
 5839        }
 40
 41        public static ServiceSecurityContext Anonymous
 42        {
 43            get
 44            {
 20645                if (s_anonymous == null)
 46                {
 447                    s_anonymous = new ServiceSecurityContext(EmptyReadOnlyCollection<IAuthorizationPolicy>.Instance);
 48                }
 20649                return s_anonymous;
 50            }
 51        }
 52
 53        public static ServiceSecurityContext Current
 54        {
 55            get
 56            {
 057                ServiceSecurityContext result = null;
 58
 059                OperationContext operationContext = OperationContext.Current;
 060                if (operationContext != null)
 61                {
 062                    MessageProperties properties = operationContext.IncomingMessageProperties;
 063                    if (properties != null)
 64                    {
 065                        SecurityMessageProperty security = properties.Security;
 066                        if (security != null)
 67                        {
 068                            result = security.ServiceSecurityContext;
 69                        }
 70                    }
 71                }
 72
 073                return result;
 74            }
 75        }
 76
 77        public bool IsAnonymous
 78        {
 79            get
 80            {
 081                return this == Anonymous || IdentityClaim == null;
 82            }
 83        }
 84
 85        // TODO: Claim is from IdentityModel but I needed to expose it. This needs to be resolved.
 86        public Claim IdentityClaim
 87        {
 88            get
 89            {
 090                if (_identityClaim == null)
 91                {
 092                    _identityClaim = SecurityUtils.GetPrimaryIdentityClaim(AuthorizationContext);
 93                }
 094                return _identityClaim;
 95            }
 96        }
 97
 98        public IIdentity PrimaryIdentity
 99        {
 100            get
 101            {
 228102                if (_primaryIdentity == null)
 103                {
 76104                    IIdentity primaryIdentity = null;
 76105                    IList<IIdentity> identities = GetIdentities();
 106                    // Multiple Identities is treated as anonymous
 76107                    if (identities != null && identities.Count == 1)
 108                    {
 17109                        primaryIdentity = identities[0];
 110                    }
 111
 76112                    _primaryIdentity = primaryIdentity ?? SecurityUtils.AnonymousIdentity;
 113                }
 228114                return _primaryIdentity;
 115            }
 116        }
 117
 118        public WindowsIdentity WindowsIdentity
 119        {
 120            get
 121            {
 0122                if (_windowsIdentity == null)
 123                {
 0124                    WindowsIdentity windowsIdentity = null;
 0125                    IList<IIdentity> identities = GetIdentities();
 0126                    if (identities != null)
 127                    {
 0128                        for (int i = 0; i < identities.Count; ++i)
 129                        {
 0130                            if (identities[i] is WindowsIdentity identity)
 131                            {
 132                                // Multiple Identities is treated as anonymous
 0133                                if (windowsIdentity != null)
 134                                {
 0135                                    windowsIdentity = WindowsIdentity.GetAnonymous();
 0136                                    break;
 137                                }
 0138                                windowsIdentity = identity;
 139                            }
 140                        }
 141                    }
 142
 0143                    _windowsIdentity = windowsIdentity ?? WindowsIdentity.GetAnonymous();
 144                }
 0145                return _windowsIdentity;
 146            }
 147        }
 148
 245149        internal ReadOnlyCollection<IAuthorizationPolicy> AuthorizationPolicies { get; set; }
 150
 151        public AuthorizationContext AuthorizationContext
 152        {
 153            get
 154            {
 186155                if (_authorizationContext == null)
 156                {
 63157                    _authorizationContext = AuthorizationContext.CreateDefaultAuthorizationContext(AuthorizationPolicies
 158                }
 186159                return _authorizationContext;
 160            }
 161        }
 162
 163        public IList<IIdentity> GetIdentities()
 164        {
 78165            AuthorizationContext authContext = AuthorizationContext;
 78166            if (authContext != null && authContext.Properties.TryGetValue(SecurityUtils.Identities, out object identitie
 167            {
 46168                return identities as IList<IIdentity>;
 169            }
 32170            return null;
 171        }
 172    }
 173}