9/24/2008 12:14:00 PM

Вообще в Composite Web Application Block достаточно неплохо реализована авторизация (она базируется на Security-блоке из Enterprise Library). Но есть и недостаток в этой реализации: правила (rules) можно можно применять к ресурсам в рантайме, но декларировать (задавать) их можно только в конфигурационном файле.

Для тех, кто не сталкивался, объясню: правило (rule) - это некая именованая комбинация ролей и/или пользовательских имен. Например, можно создать правило, разрешающее управлять пользователями, которое будет определяться комбинацией "Роль Администратор или роль Менеджер или пользователь Вася Пупкин".
В конфигурации это задается так:

<rules>
    <add expression="R:Administrator OR R:Manager OR I:pupkin" name="AllowManageUsers"/>
</rules>

А используется это потом вот так, в конфигурационном файле:

<authorization>
   <rule Url="~/BackEnd/ManageUsers.aspx" Rule="AllowManageUsers"/>
</authorization>

Либо вот так, в рантайме:

authorizationRuleService.RegisterAuthorizationRule(url, ruleName);

Понятное дело, что сказав "а", хотелось бы и "б" сказать, то есть, иметь возможность "на лету" определять правила, а не только пользоваться уже имеющимися. Например, это было бы удобно делать при инициализации модуля (в наследнике ModuleInitializer), чтобы каждый модуль имел возможность задать свои собственные правила и применить их к своим ресурсам. Однако, как я уже и сказал, "out of box" такой возможности нет.

Однако, благодаря "сервисной" структуре Composite Web и Enterprise Library, ее можно добавить. Для этого нужно расширить поведение неустраивающих нас сервисов.

В нашем случае это AuthorizationRuleService из Composite Web, который отвечает за авторизацию, но не дает возможности зарегистрировать новое правило, и AuthorizationRuleProvider, который, собственно, и выполняет всю работу и который "заполняется" правилами из конфигурационного файла.

Я просто расширил эти два механизма, написав свою реализацию AuthorizationProvider и IAuthorizationService. Кроме этого сервис авторизации реализует еще и интерфейс IRuleRegisterService, который я ввел для того, чтобы иметь возможность регистрировать правила в рантайме. Код всего этого дела в этом же постинге.

Теперь, когда у  нас есть собственные реализации этих двух вещей, нужно сказать Composite Web, что нужно использовать их вместо дефолтных.

Для регистрации провайдера просто меняем тип в конфигурационном файле:

<securityConfiguration defaultAuthorizationInstance="RuleProvider" defaultSecurityCacheInstance="">
    <authorizationProviders>
        <add type="WebClientApplication.Shell.Providers.ShellAuthorizationRuleProvider, Shell" name="RuleProvider">
            <rules>
                <add expression="R:Administrator OR R:Manager OR I:pupkin" name="AllowManageUsers"/>
            </rules>
        </add>
    </authorizationProviders>
</securityConfiguration>

В случае сервиса идем в ModuleInitializer "главного" модуля (Shell), там есть функция AddGlobalServices, в которой регистрируется сервис IAuthorizationService. Выкидываем эту строчку, а вместо нее пишем:

IAuthorizationService newAuthService
    = globalServices.AddNew<ShellAuthorizationRuleService, IAuthorizationService>();

IRuleRegisterService ruleRegistrator = newAuthService as IRuleRegisterService;
if (ruleRegistrator != null) globalServices.Add<IRuleRegisterService>(ruleRegistrator);

Таким образом мы регистрируем один класс в виде сразу двух сервисов: IAuthorizationService (так, что подмены никто не заметит) и IRuleRegisterService, который позволит нам регистрировать правила "на лету".

Ну а пользоваться всем этим хозяйством - задача уже совсем рутинная:

 

public override void Load(CompositionContainer container)
{
    base.Load(container);

    AddGlobalServices(container.Parent.Services);
    AddModuleServices(container.Services);
    RegisterSiteMapInformation(container.Services.Get<ISiteMapBuilderService>(true));

    IRuleRegisterService ruleRegistrator = container.Services.Get<IRuleRegisterService>();
    if (ruleRegistrator != null) RegisterRules(ruleRegistrator);

    IAuthorizationRulesService rulesService = container.Services.Get<IAuthorizationRulesService>();
    if (rulesService != null) ApplyRules(rulesService);
}

private void ApplyRules(IAuthorizationRulesService rulesService)
{
    rulesService.RegisterAuthorizationRule("~/AdminPage.aspx", "OnlyForAdministrators");
}

private void RegisterRules(IRuleRegisterService ruleRegistrator)
{
    AuthorizationRule commonRule = new AuthorizationRule("OnlyForAdministrators", "R:Administrator");
    ruleRegistrator.RegisterRule("OnlyForAdministrators", commonRule);
}

Выделено то, что добавилось к уже имеющемуся коду инициализатора модуля. Там регистрируются правила (в моем случае всего одно: OnlyForAdministrators), а потом правила регистрируются для авторизации доступа к ресурсам.

WCABAuthorization.zip (4.09 kb)

4/9/2008 9:02:08 PM
3/16/2008 5:49:49 PM

Сделал проект с использованием Web Client Software Factory - очень удобная, надо сказать, штука.
"Прикрутил" к этому проекту MS Ajax Toolkit и столкнулся с тем, что веб-сервисы не обрабатываются ObjectBuilder'ом, соответственно, "достучаться" до контроллера модуля не представляется возможным.
Можно, конечно, явно создавать экземпляр контроллера прямо в веб-сервисе, но это тоже ничего не даст в том случае, если контроллер использует какие-то зарегистрированные сервисы, а обычно это так и есть.

Вторично я столкнулся с той же проблемой когда стал делать HttpHandler для множественной загрузки файлов на сервер. Точно так же нужно было работать с имеющейся инфраструктурой (контроллером модуля, сервисами), ведь не писать же повторно тот же самый код, только в обход общей архитектуры?!

Однако, проблема решилась банально просто.
Для HttpHandlers я сделал примитивный базовый класс, от которого наследуются все конкретные обработчики.

public abstract class HttpHandlerBase : IHttpHandler
{
    public HttpHandlerBase()
    {
        WebClientApplication.BuildItemWithCurrentContext(this);
    }
    public abstract bool IsReusable { get; }
    public abstract void ProcessRequest(HttpContext context);
}

То есть, в конструкторе экземпяра мы просто "пропускаем" его через ObjectBuilder (WebClientApplication - это класс приложения Web Client Software Factory) и, соответственно, можем пользоваться всей нужной нам инфраструктурой.

То же самое можно сделать и для веб-сервисов.

6/20/2007 7:23:00 AM

После ожидания, задержек (релиз ожидался еще в мае), после того, как некоторые MVP публично ругались в своих блогах "я делал свои обещания на основе ваших обещаний и теперь вы заставляете меня выглядеть нелепо", релиз все-таки случился.

Рекомендую обновиться.

Скачать можно здесь. Инструкция по установке здесь.

Хотя, если верить этому графику, где-то не за горами должен быть и релиз 2.0 и вот там должно быть много интересного. Наверное тоже отложится.

6/7/2007 9:36:00 AM

Несмотря на название данный постинг будет не о путешествиях, а о программировании, извиняюсь :)

Acropolis - это фреймворк от Майкрософт для разработки клиентских приложений на платформе .NET c использованием WPF. Два дня назад стала доступна версия CTP1, о которой я немного и расскажу.
Для установки и работы понадобится Microsoft Visual Studio "Orcas" Beta1, которую тоже можно свободно загрузить с сайта Майкрософт.

Задачи, которые могут быть легко решены с помощью Акрополиса таковы:

  1. Модульная разработка приложения.
  2. Работа с темами пользовательского интерфейса
  3. Четкое разделение бизнес-логики приложения и этого самого пользовательского интерфейса.
  4. Легкость и прозрачность взаимодействия различных частей приложения.
  5. Простота создания модулей приложения.

Как видите, этот список очень пересекается с тем, что мы имеем в случае Composite UI Application Block,  однако сразу скажу, что Acropolis не использует ни CAB, ни Enterprise Library вообще.

Теперь немного о том, как это работает сейчас.
Основными "строительными блоками" приложения в Acropolis являются Services и Parts.
Services - сервисы - это то же самое, что и сервисы в CAB - спрятанные за интерфейсами сущности, к которым можно обращаться из приложения для доступа к какой-либо функциональности.
Part - это некоторая логически обособленная часть приложения, реализующая некоторую бизнес-логику. Part - это модуль, UseCase. Например, модуль редактирования документа. Каждый Part может иметь несколько Views - представлений, реализующих пользовательский интерфейс.
Добавить Part  в проект можно, выбрав нужный тип элемента из стандартного списка "Add -> New Item..", при этом можно одним кликом добавить связку Part и View.
Что интересно, Part, так же как и View, описывается декларативно с помощью XAML и может "настраиваться" прямо в design-time. Вот как это выглядит:

Acropolis Part - Design

Подчеркну, это не кусок пользовательского интерфейса, это настройка модуля бизнес-логики. Здесь с помощью простого перестакивания мышкой (или с помощью написания XAML, как удобно) можно указать Сервисы, от которых зависит и с которыми должна работать данная часть приложения (в моем случае я задекларировал зависимость от сервиса SuperService), задать ConnectionPoints - попросту говоря, набор свойств и команд, которые будут доступны из представления (View) (в моем случае это свойство DocumentText и команда DoSomethingCommand). Здесь же задаются и другие параметры, которые видны на скриншоте.

Представление (View) же представляет собой "обычный" XAML-файл, внутри которого можно располагать различные элементы управления, с которыми будет взаимодействовать пользователь.

Разобраться и работать с Acropolis достаточно легко, фреймворк снабжен документацией, в которой на примерах показано, как можно реализовывать ту или иную функциональность.
Задумка мне очень понравилась, будем надеяться, что следующие CTP, беты и релизы не заставят себя долго ждать.

Скачать и посмотреть самому можно здесь. Там же есть простенькое видео, демонстрирующее некоторые возможности фреймворка.

6/7/2007 6:57:00 AM

Коротко: с выходом Acropolis разработчики далее не планируют развивать SCSF (Smart Client Software Factory). Однако поддержка останется, в частности приделают поддержку WPF.

Подробности здесь: http://blogs.msdn.com/gblock/archive/2007/06/06/acropolis-the-future-of-smart-client.aspx

5/21/2007 3:02:00 AM

Буду краток.

Майский релиз SCSF. Поддержка WPF, CAB, улучшенный гайдлайн и т.д.

Брать можно здесь: http://www.codeplex.com/smartclient

 

4/13/2007 3:00:00 AM

Я уже писал о том, что такое DSL и Software Factories, как выражается второе через первое и т.д.

Теперь вы можете увидеть это своими глазами на примере Services Software Factory V3.
Причем, именно увидеть: здесь разработчики выложили видео (рекомендую скачать, всего 11 мегабайт, но виднее) о том, как будет работать следующая версия их фабрики.

Отличия в частности в том, что в данном случае мы будем иметь "классический" DSL вместо обычного для фабрик набора указаний "сделай то-то".

Лично мне этот вариант кажется более логичным, гибким и удобным.

А вообще посмотреть стоит даже не столько ради самой фабрики, сколько ради того, как следует применять DSL. Просматривая ролик, подумайте о том, что если бы в ваших приложениях и фреймворках, которые вы поддерживаете и на базе которых делаете продукт, применялась такая техника - сколько времени вы бы каждый раз экономили? :)

2/16/2007 5:20:00 AM

Неудобством Web Client Software Factory является было то, что фабрика создавала и поддерживала Web Site Application Project.

Со вчерашнего дня эту фабрику можно "научить" работать и с Web Application Project.

Сделать это можно так:

  1. Установить исходные коды фабрики, если они еще не установлены. Для этого нужно просто в главном меню (Start) в папке фабрики запустить WebClientFactorySourceInstall.msi.
  2. Скачать дополнения: WebClientFactoryWAPSupport (это zip-файл)
  3. Найти в установленных исходниках папку GP и распаковать туда содержимое архива из пункта 2.
  4. Из распакованной папки WebClientFactoryWAPSupport открыть файл решения WebClientFactory Guidance Package.sln и сделать Build всего этого дела. Все должно пройти нормально, если архив был распакован в правильное место.
  5. Щелкнуть правой кнопкой мыши на проекте WebClientFactoryPackage и зарегистрировать получившийся Guidance Package (процесс займет какое-то время).

Все, теперь можно создавать Web Client Project'ы с использованием Web Application Project. Что не может не радовать.

Оригинальная инструкция здесь: http://www.codeplex.com/websf/Wiki/View.aspx?title=Web%20Application%20Project%20Guidance%20Package

1/21/2007 5:10:00 AM

Как я уже говорил, фабрики позволяют нам разрабатывать приложение на несколько более высоком уровне благодаря тому, что дают возможность оперировать не просто классами, структурами и т.д, а бизнес-объектами нашего приложения. То, как именно должен выглядеть бизнес-объект для того, чтобы укладываться в рамки архитектуры, берет на себя "фабрика".

Например, уже существуют такие "фабрики", как Smart Client Software Factory, позволяющая легко и безо всякой рутины создавать приложения на основе CAB (Composite UI Application Block). С помощью этой "фабрики" мы оперируем сущностями CAB'а, такими, как "контроллер", "вью", "воркайтем" и т.д.
Существует (на мой взгляд менее удачная, но позволяющая значительно сократить время разработки) "фабрика" для создания слоя веб-сервисов, существуют и другие.

Теперь вот существует и Web Client Software Factory.

Хороших новостей несколько.
Во-первых, она опирается на Composite Web Application Block. Это, на мой взгляд, очень замечательная штука. Это, скажем так, CAB для ASP.NET (да, уважаемый Void, с ObjectBuilder'ом и т.д. и т.п. ;) ). Нет только EventBroker'а, да он там и не нужен.
Во-вторых, она опирается так же на Page Flow Application Block. Это не менее замечательная штука, позволяющая действительно (!) легко включать в веб-приложение Workflow Foundation. Это трудно переоценить, на мой взгляд.
В третьих, это все же "фабрика", так что, создавать приложение в рамках архитектуры этих двух блоков - что мышкой кликать, ниже я покажу.
В четвертых, все это дело (включая злополучный ObjectBuilder) замечательно документировано. Лично я документацию прочитал от первой строчки и до последней - написано четко, по делу, без воды, очень доходчиво: что, как, где, почему.

Словом, мне эта штука очень понравилась.
Несколько примеров в общем виде (быть может, если в голову взбредет, позже я напишу подробнее):

В контекстное меню solution'а "фабрика" добавит несколько новых пунктов. В частности, появится возможность добавлять модули в свое приложение (а где вы видели CAB без модулей?).

Можно добавить три типа модуля: Business Module, Foundation Module и Page Flow.

Business Module - это какая-то часть функциональности приложения. То есть, модуль в "чистом" его виде - есть модуль - есть функционал, нет модуля - нет функционала. Ну, например, можно сделать модуль с блогами, модуль с форумами, модуль с доской объявлений для сайта и т.д.

Foundation Module - это модули бизнес-логики. Там предполагается размещать различные сервисы (а где вы видели CAB без сервисов?), провайдеры и т.д. Например, можно сделать модуль, который содержит логику работы с данными. Поменялась база - стер старый модуль, добавил новый. Приложение продолжает работать.

Page Flow - ну, тут из названия все понятно. Здесь предлагается определять workflows наших походов по сайту. Ну, например, процесс выполнения заказа юзером. Сначала он попадает в свою корзину товаров, потом жмет "заказать" и попадает на форму ввода адреса и условий доставки, потом - страничка оплаты и в конце - поздравления. Или ошибки на каждом из шагов. Или что-то еще. Словом, все, что нам потребуется - это нарисовать state-диаграмму того, как в принципе могут осуществляться переходы и при каких условиях. Об остальном позаботится Workflow Foundation со всеми его плюсами.

Да, при создании каждого модуля, с программиста будет спрошено название а так же не хочет ли он создать проект для юнит-тестов модуля или посмотреть документацию. Очень удобно.

Впрочем, в контекстном меню веб-сайта тоже прибыло. Там появился пунктик "Web Client Factory -> Add view (with presenter)". Клик по нему "родит" окошко в виде:
Add view with presenter "Фабрика" учтиво спросит, какое именно "View" нужно создать, к какому модулю оно относится и где будет размещаться.

На картинке видно, что создан будет и сам "View", и его интерфейс (IView1 в моем случае), и его Presenter (View1Presenter).

Связь между View и Presenter'ом тоже будет установлена автоматически. Если не полениться и зайти в code behind самой вьюшки, то это будет видно.

Собственно, вот таким вот нехитрым способом я уже создал вполне себе работающую болванку приложения. Сколько у меня ушло времени? Несколько минут?
Если эту болванку сейчас запустить - то там даже кое-какая навигация будет (о том почему она будет и откуда берется - может быть позже, но забегая вперед скажу: Composite Web Application Block + Factory - это вам не только мышкой тыкать да страницы создавать. Это еще и обильная функциональность, сдобренная набором сервисов).

В моем случае мне останется только накидать контролов во вьюшку да реализовать логику ее работы.
О том, как, почему и где - в другой раз. Может быть.

Powered by BlogEngine.NET 1.6.0.0

About the author

Alexey Raga Alexey Raga
.NET software developer.

E-mail me Send mail

Twitter


Disclaimer

The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2010

Sign in