Маскирование данных на IQueryable, но с сохранением возможности фильтрации по замаскированным данным

#c# #.net #odata

Вопрос:

У меня есть конечная точка OData, которая возвращает IQueryable моих пользователей. Мне нужно замаскировать конфиденциальные данные, которые возвращаются, и я выбрал подход, который можно увидеть ниже.

 public IQueryable<User> Get()
{
    return _defaultContext.Users
             .AsQueryable()
             .Select(x => new User
             {
                 Id = x.UserId,
                 FirstName = x.FirstName,
                 SecondName = x.SecondName,
                 EmailAddress = x.EmailAddress != null ?
                                x.EmailAddress.Substring(0, 3)   "*****"  
                                x.EmailAddress.Substring(int.Parse((x.EmailAddress.IndexOf("@").ToString()))) :
                                string.Empty,
                 MobilePhone = x.MobilePhone != null ?
                               "*** *** "  
                               x.MobilePhone.Substring(x.MobilePhone.Length - 4) :
                               string.Empty,
                 IdentityNumber = x.IdentityNumber.Substring(0, 3)  
                                  " *** *** "  
                                  x.IdentityNumber.Substring(x.IdentityNumber.Length - 4),
                 IdNumberTypeId = x.IdentityTypeId,
                 DateOfBirth = x.DateOfBirth,
                 CountryOfIssue = x.CountryOfIssue.IsoCode
             });
}
 

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я не могу фильтровать замаскированные данные при выполнении вызова GET, как я могу фильтровать незамаскированные данные.

 https://myurl.com/odata/v2.3/user?$select=Id,FirstName,SecondName,EmailAddress,MobilePhone,IdentityNumberamp;$skip=0amp;$top=10amp;$count=trueamp;$filter=indexof(tolower(FirstName), '2') gt -1 or indexof(tolower(SecondName), '2') gt -1 or indexof(tolower(IdentityNumber), '2') gt -1amp;$orderby=Id ascamp;_=1622190148820
 

Есть ли способ обойти эту проблему, будь то лучший способ маскировки выбранных конфиденциальных данных или что-то еще, чего мне не хватает?

Комментарии:

1. Вам нужно нанести маскировку в качестве последнего шага. Вы можете попробовать использовать его в качестве метода расширения, чтобы у вас было что-то вроде usersQuery.ApplyFilters().MaskData()

2. С другой стороны, если вы можете фильтровать замаскированные данные, то я могу об этом догадаться. Может быть, не совсем адрес, но номер телефона, например, можно получить с помощью фильтрации. Например: Я применяю фильтр с полным номером телефона, у возвращенных пользователей будет этот номер телефона, так что для безопасности.