/// <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())); }
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) }); }