WCF Dataservice - изменить объект перед возвратом результатов? - PullRequest
3 голосов
/ 11 сентября 2011

Я использую службы данных WCF, и у меня есть несколько полей / свойств, которые я хочу "очистить" (установить значение в пустую строку или ноль) перед отправкой обратно клиенту.

Например: пользовательТаблица имеет столбец пароля, который я не хочу передавать значение клиенту.Это один из примеров, в приложении есть и другие такие столбцы, в которых значение должно быть исключено из соображений безопасности / конфиденциальности.

Извините за такой простой вопрос, я новичок в службах данных WCF и не нашел ни одногоперспективных пока нет.Я пробовал QueryInterceptors, но не повезло.

Может кто-нибудь направить меня в правильном направлении?

Спасибо

1 Ответ

4 голосов
/ 11 сентября 2011

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, могут быть и другие подходы к ограничению доступа к некоторым ресурсам, но этот самый простой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...