#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. С другой стороны, если вы можете фильтровать замаскированные данные, то я могу об этом догадаться. Может быть, не совсем адрес, но номер телефона, например, можно получить с помощью фильтрации. Например: Я применяю фильтр с полным номером телефона, у возвращенных пользователей будет этот номер телефона, так что для безопасности.