IMO, это выходит за рамки WCF Data Services. Службы данных WCF предназначены для того, чтобы взять модель вашей сущности и представить ее в соответствии с правилами доступа. Если ваша сущность предоставляет некоторые свойства, и эта сущность выставлена, ее свойства просто общедоступны. Это для простых сценариев CRUD или сценариев только для чтения.
QueryInterceptor
вам не поможет, потому что его можно использовать для авторизации на основе данных - это означает, что QueryInterceptor
может добавить некоторые дополнительные условия для фильтрации записей, которые текущий пользователь не имеет права видеть = он отфильтрует целые записи, но это не изменит отфильтрованный результат.
Нет привязки к пустым полям, потому что это плохой подход. Если вы не хотите выставлять некоторые поля, они вообще не должны быть частью выставленной сущности. Вы можете создать вторую сущность только для чтения, отображающую только открытые поля, используя QueryView в файле EDMX. Далее вам нужно изменить правила доступа в вашем DataServiceConfiguration
. Вы должны удалить правило доступа к исходному набору сущностей User
и добавить правила доступа для чтения к этому новому набору сущностей.
Если вам нужно контролировать правила доступа для каждого пользователя, вы должны использовать в своей службе какую-либо аутентификацию , и вы должны обработать это методом InitializeService
(если DataServiceConfiguration
не доступен в другом месте). Что-то вроде:
public static void InitializeService(DataServiceConfiguration config)
{
var context = ServiceSecurityContext.Current;
if (context != null && context.PrimaryIdentity != null)
{
var userName = context.PrimaryIdentity.Name;
if (SomeMethodToValidateUserPermissions(userName)
{
config.SetEntitySetAccessRule("Users", EntitySetRights.AllRead);
}
}
config.SetEntitySetAccessRule("TrimmedUsers", EntitySetRights.AllRead);
}
Если углубиться в WCF, могут быть и другие подходы к ограничению доступа к некоторым ресурсам, но этот самый простой.