Exemple #1
0
        /// <summary>
        /// Checks the specified claims to determine whether the account should be filtered.
        /// </summary>
        /// <param name="claims">The claims.</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException">claims</exception>
        public async Task <AccountFilterResult> Check(IEnumerable <Claim> claims, CancellationToken cancellationToken)
        {
            var allClaims          = claims.ToArray();
            var accountFilterRules = new List <AccountFilterRuleResult>();
            var filters            = await _filterStore.GetAll(cancellationToken).ConfigureAwait(false);

            foreach (var filter in filters)
            {
                var errorMessages = new List <string>();
                foreach (var rule in filter.Rules)
                {
                    var claim = allClaims.FirstOrDefault(c => c.Type == rule.ClaimType);
                    if (claim == null)
                    {
                        errorMessages.Add(string.Format(ErrorMessages.TheClaimDoesntExist, rule.ClaimType));
                        continue;
                    }

                    switch (rule.Operation)
                    {
                    case ComparisonOperations.Equal:
                        if (rule.ClaimValue != claim.Value)
                        {
                            errorMessages.Add(
                                string.Format(
                                    ErrorMessages.TheFilterEqualsIsWrong,
                                    claim.Type,
                                    rule.ClaimValue));
                        }

                        break;

                    case ComparisonOperations.NotEqual:
                        if (rule.ClaimValue == claim.Value)
                        {
                            errorMessages.Add(
                                string.Format(
                                    ErrorMessages.TheFilterNotEqualsIsWrong,
                                    claim.Type,
                                    rule.ClaimValue));
                        }

                        break;

                    case ComparisonOperations.RegularExpression:
                        var regex = new Regex(rule.ClaimValue);
                        if (!regex.IsMatch(claim.Value))
                        {
                            errorMessages.Add(
                                string.Format(
                                    ErrorMessages.TheFilterRegexIsWrong,
                                    claim.Type,
                                    rule.ClaimValue));
                        }

                        break;
                    }
                }

                var accountFilterRule = new AccountFilterRuleResult(filter.Name, errorMessages.Count == 0, errorMessages.ToArray());
                accountFilterRules.Add(accountFilterRule);
            }

            return(!accountFilterRules.Any()
                ? new AccountFilterResult(true)
                : new AccountFilterResult(accountFilterRules.Any(u => u.IsValid), accountFilterRules.ToArray()));
        }
Exemple #2
0
        public async Task <AccountFilterResult> Check(IEnumerable <Claim> claims)
        {
            if (claims == null)
            {
                throw new ArgumentNullException(nameof(claims));
            }

            var accountFilterRules = new List <AccountFilterRuleResult>();
            var filters            = await _filterRepository.GetAll();

            if (filters != null)
            {
                foreach (var filter in filters)
                {
                    var accountFilterRule = new AccountFilterRuleResult(filter.Name);
                    var errorMessages     = new List <string>();
                    if (filter.Rules != null)
                    {
                        foreach (var rule in filter.Rules)
                        {
                            var claim = claims.FirstOrDefault(c => c.Type == rule.ClaimKey);
                            if (claim == null)
                            {
                                errorMessages.Add($"the claim '{rule.ClaimKey}' doesn't exist");
                                continue;
                            }

                            switch (rule.Operation)
                            {
                            case ComparisonOperations.Equal:
                                if (rule.ClaimValue != claim.Value)
                                {
                                    errorMessages.Add($"the filter claims['{claim.Type}'] == '{rule.ClaimValue}' is wrong");
                                }
                                break;

                            case ComparisonOperations.NotEqual:
                                if (rule.ClaimValue == claim.Value)
                                {
                                    errorMessages.Add($"the filter claims['{claim.Type}'] != '{rule.ClaimValue}' is wrong");
                                }
                                break;

                            case ComparisonOperations.RegularExpression:
                                var regex = new Regex(rule.ClaimValue);
                                if (!regex.IsMatch(claim.Value))
                                {
                                    errorMessages.Add($"the filter claims['{claim.Type}'] match regular expression {rule.ClaimValue} is wrong");
                                }
                                break;
                            }
                        }
                    }

                    accountFilterRule.ErrorMessages = errorMessages;
                    accountFilterRule.IsValid       = !errorMessages.Any();
                    accountFilterRules.Add(accountFilterRule);
                }
            }

            if (!accountFilterRules.Any())
            {
                return(new AccountFilterResult
                {
                    IsValid = true
                });
            }

            return(new AccountFilterResult
            {
                AccountFilterRules = accountFilterRules,
                IsValid = accountFilterRules.Any(u => u.IsValid)
            });
        }