Безопасность в ADO.NET Data Services

Перехватчики - это специальные методы, которые исполняются на каждую отдаваемую клиенту сущность.Например, у меня есть коллекция, которая возвращает набор заказчиков.
Я могу создатьследующий перехватчик:[QueryInterceptor("Customers")]publicFunc<Customers, bool> OnQueryCustomers(){returnc => c.ContactName.Contains(" ") == false;}Как видно, этот метод возвращает лямбда-выражение, которое исполняется при отдачеклиенту каждой сущности.
Это лямбда-выражение возвращет булевское значение, если оноравно true, то данная сущность отдаете клиенту, если false, то клиент ничего об этойсущности не узнает :) В данном примере мы выдаем только те сущности Customer, которыене содержат пробелов.
Можно переделать этот пример следующим образом:[QueryInterceptor("Customers")]publicFunc<Customers, bool> OnQueryCustomers(){returnc => c.ContactName == HttpContext.Current.User.Identity.Name;}В этом случае мы используем HttpContext и получаем имя текущего пользователя.
Затемесли имя текущего пользователя и поле ContactName совпадают, то эту сущность мы клиентуотдаем.
Таким образом, каждый пользователь будет работать со своим набором данных,несмотря на то, что данные для всех пользователей хранятся в одной таблице.Перехватичик существуют не только для операций выборки, но и для операций модификации.В этом случае перехватчик представляет собой метод, который генерирует исключение,в случае, если операция недопустима.[ChangeInterceptor("Customers")]publicvoidOnChangeCategories(Customers c, UpdateOperations mode)         {if((mode == UpdateOperations.Add) || (mode == UpdateOperations.Change)){if(c.ContactTitle.Contains(" ") == true){thrownewDataServiceException(400, "Contact title consist of a single word.")}}}Видно, что в перехватчик принимает два параметра - изменяемую сущность и тип операции.В случае ошибки генерируется исключение DataServiceException.Точно также можно использовать инфраструктуру безопасности при модификации данных.[ChangeInterceptor("Customers")]publicvoidOnChangeCategories(Customers c, UpdateOperations mode)         {if(mode == UpdateOperations.Delete){if(c.ContactName == HttpContext.Current.User.Identity.Name){thrownewDataServiceException(400, "You canm"t delete it.")}}}Важная особенность перехватчиков, что эти методы помечаются атрибутами QueryInterceptorили ChangeInterceptor, в параметрах которых мы указываем для какой сущности предназначеныэти перехватчики.Вот такие механизмы контроля безопасности существуют в ADO.NET Data Services....(read more)

Страницы