Диссертация (1148251), страница 19
Текст из файла (страница 19)
Затемреализуются классы аспектов, добавляются команды компоновщику аспектов всобытия аспектного проекта и далее, при сборке, происходит бесшовнаяинтеграция настроек и вставка действий аспектов в целевое приложение.4.4 Аспект для аутентификации на базе формАутентификация — это процесс проверки подлинности пользователя, какправило, на основе имени и пароля.В качестве аутентификации начального уровня веб-приложения используютаутентификацию на базе форм (forms authentication).
В этом случае приобращении к любой странице сайта сервер проверит наличие в запросеспециального cookie-файла (токена) и, если он отсутствует, переправитпользователя на страницу (форму) ввода имени и пароля. В том случае если ихпроверказаканчиваетсяуспешно,сервервыдаетпользователютокенаутентификации и в дальнейшем проверяет его наличие в запросах.
Как толькоистекает срок действия токена, требуется пройти аутентификацию повторно.ASP.NET поддерживает достаточно простую аутентификацию на базе форм,для этого достаточно её включить в конфигурационном файле и создатьотдельную страницу с полями для ввода имени пользователя и пароля. Как ужерассмотреновыше,измененияконфигурацииописываютсяаспектного проекта. Рассмотрим простейший вариант:вweb.config103<configuration><system.web><authentication mode="Forms"><forms loginUrl="~/Pages/Login.aspx"><credentials passwordFormat="Clear"><user name="admin" password="passw" /></credentials></forms></authentication></system.web></configuration>ЛИСТИНГ 41.
ВКЛЮЧЕНИЕ АУТЕНТИФИКАЦИИ НА БАЗЕ ФОРМ В ASP.NETДанный код декларирует, что имя пользователя и пароль должны совпадатьс “admin” и “passw”, а страница Login.aspx для их ввода находится в папке Pages.Реализация веб-страницы заключается в создании кода разметки (code-behind) вфайле .aspx, а также в реализации класса с бизнес-логикой в файлах .aspx.cs и.aspx.designer.cs. Данный класс будет помещен компилятором в сборку .dll и приобращении к странице ASP.NET свяжет её с этим классом.Требованиебесшовногорасширенияаспектомцелевогопроектанакладывает ограничение на изменение целевого проекта, поэтому невозможнопросто добавить в целевой проект новую страницу, ведь в этом случае меняютсяего настройки. С другой стороны, аспект также можно создать в проекте типа вебприложение и добавить страницу туда.
Однако тогда cookie-файлы и сессия небудут разделяться между целевым и аспектными веб-приложениями, что приведетк отказу аутентификации. Приемлемым решением является создание Login.aspxстраницы в проекте аспекта (с типом “библиотека классов”), копирование её впапку Pages целевого проекта (без добавления в целевой проект Microsoft VisualStudio), а описание класса в Login.aspx.cs и Login.aspx.designer.cs остается васпектном проекте и будет помещено компилятором в аспектную сборку.Компоновщик аспектов объединяет целевую и аспектные сборки, поэтомуASP.NET корректно свяжет новую аспектную страницу Login.aspx с кодом еёкласса.
Исходный код страницы Login.aspx зависит от дизайна веб-приложения.Возможный вариант для веб-приложения SportsStore на платформе ASP.NETMVC из книги [130] приведен ниже:104<%@ Page Title="" Language="C#" MasterPageFile="~/Pages/Admin/Admin.Master"AutoEventWireup="true" CodeBehind="Login.aspx.cs"Inherits="SportsStore.Pages.Login" %><asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server"><asp:ValidationSummary runat="server" DisplayMode="SingleParagraph" CssClass="error"/><div class="loginContainer"><div><label for="name">Name:</label><input name="name" /></div><div><label for="password">Password:</label><input type="password" name="password" /></div><button type="submit">Log In</button></div></asp:Content>Login.aspx.cs:using System;using System.Web.Security;namespace SportsStore.Pages {public partial class Login : System.Web.UI.Page {protected void Page_Load(object sender, EventArgs e) {}}}if (IsPostBack) {string name = Request.Form["name"];string password = Request.Form["password"];if (name != null && password != null&& FormsAuthentication.Authenticate(name, password)) {FormsAuthentication.SetAuthCookie(name, false);Response.Redirect(Request["ReturnUrl"] ?? "/");} else {ModelState.AddModelError("fail", "Login failed.
Please try again");}}ЛИСТИНГ 42. ВОЗМОЖНЫЙ ВАРИАНТ СТРАНИЦЫ LOGIN.ASPX4.5 Выводы по главеВ рамках данной главы ставилась задача создания универсальных аспектов,которые могут быть применены к различным облачным приложениям. Каквытекает из предыдущей главы, аспекты могут быть описаны как в программномкоде, так и в файле конфигурации (обычно в web.config). Оба этих способазадействуются в аспекте, который перенаправляет отладочную информацию воблачное хранилище WAD: действия аспекта запускают диагностический105монитор, а файл конфигурации аспекта регистрирует этот диагностическиймонитор в качестве приемника отладочной информации.Далее представлен аспект, который повышает надежность любого целевогометода путем определения стратегии реакции на его исключения.
В качествепримера взята стратегия “Предохранитель” (Circuit Breaker), но пользовательможет заменить её любой подходящей.Следующим описан аспект, повышающий производительность целевогометода, через кэширование его результата средствами Windows Azure Caching. Вэтом случае необходимо добавить в аспектный проект пакет Windows AzureCaching, в статическом конструкторе аспекта создать объект кэша, а затем вдействии аспекта перехватить целевой метод и воспользоваться кэшем. Настройкаоблачного кэша производится в конфигурационном файле аспекта. В том случае,когда необходимо кэшировать определенную ASP.NET страницу, следуетнастроитьобъектсоответствующегоResponse.Cacheклассаввеб-страницысобытииPage_Init().проиллюстрированПерехватзамещающимаспектным наследником.
Наконец, приведена XML-конфигурация аспекта,которая позволяет менять способ хранения веб-сессии.В том случае, когда для работы аспекта требуется добавить новую вебстраницу в целевой проект, она реализуется в аспектном проекте и .aspx файл сразметкой копируется в папку целевого проекта. Подобной техникой пользуетсяаспект, добавляющий в целевое приложение аутентификацию на базе форм.Все перечисленные аспекты объединены в библиотеку AzureLibrary.Следует также заметить, что её аспекты могут быть применены к разным целевымпроектам, но из-за различий контекста точек выполнения может возникнутьнеобходимость изменить правила внедрения и код внутри действий аспектов.106Глава 5.
Аспектно-ориентированный рефакторингоблачных веб-приложений5.1 Применимость АОП-рефакторингаплатформе Microsoft Azureдлявеб-приложенийнаОблачная платформа Microsoft Azure предоставляет множество сервисов,которые позволяют разрабатывать производительные и надежные приложения. Ктаким сервисам относятся СУБД Microsoft SQL Azure, сбор диагностическойинформации, управление своей конфигурацией, разделяемый кэш и пр. Взависимости от фактической или предполагаемой нагрузки, приложение можетувеличивать или уменьшать количество своих одновременно запущенныхэкземпляров (instances).
При этом все сложности взаимодействия с аппаратнойинфраструктурой скрыты от программиста. Сервисные компоненты Azure независят от вызывающего их контекста и, тем самым, предназначены для гибкогоповторного использования в различном окружении.Однако при этом возникает проблема “сквозной функциональности” (crosscutting concerns), когда для реализации какой-либо функции с помощью сервисовAzure, требуется вносить изменения во множество разных точек исходного кода.Если, например, в веб-роль (web-role) на основе ASP.NET MVC (Model-ViewController) потребуется добавить кэширование результатов запроса некоторыхданных из удаленного хранилища [106] и организовать управление кэшированиемчерез веб-интерфейс, то программисту придется вносить изменения в следующиемодули.1. Каждый класс, ответственный за загрузку тех данных, которыенеобходимо кэшировать.2. Модель (Model), на основе которой Вид (View) отобразит полученныеданные и элементы управления кэшированием.1073. Контроллер (Controller), который инициализирует соответствующиминастройками кэширования этот класс, применит его для заполненияданными модели и передаст её для отображения в соответствующийВид.4.
Вид, который также должен содержать веб-разметку для элементовуправления кэшированием.Подобные ситуации возникают и в ряде других задач, таких какпротоколирование, авторизация, проверка контрактов, профилирование и т.п.Сквозная функциональность затрудняет сопровождение проекта, ведь при сменеспособа решения задачи (например, авторизации), необходимо внести измененияво множество точек исходного кода. Если же на определенном этапе потребуетсявообще удалить все, относящееся к определенной функции (например,профилированию), то исходный код снова поменяется на множестве уровней.Предложим методику “сокрытия изменений” для облачных приложенийMicrosoft Azure, которая позволяет выделить весь код, необходимый дляреализации какой-либо функции, в отдельный аспект. Если в предыдущей главерассмотрены приемы создания универсальных аспектов, применимых к любомувеб-приложению, то в этой будут сформулированы конкретные принципывыделения аспектов из существующих систем.