Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Одним из нововведений в .NET 4.5.1 стало внедрение спецификации OWIN и проекта Katana. Благодаря этим нововведениям становятся доступными новые способы построения веб-приложений. Рассмотрим, что они представляют.
OWIN или Open Web Interface for .NET представляет собой спецификацию, определяющую взаимодействие между веб-приложением и веб-сервером. Современным веб-приложениям требуется больше гибкости. И ответом на эти вызовы стало появление спецификации OWIN.
Но OWIN - это спецификация, которая создавалась как открытый проект вне стен Microsofta. Непосредственной реализацией этой спецификации стал проект Katana.
Всю архитектуру проекта Katana можно представить следующим образом:
Рассмотрим основные слои этой архитектуры:
Хост: процесс, который обрабатывает приложение. Если в качестве сервера приложения используется IIS, то подобным процессом является процесс самого сервера IIS. Однако им может быть и сам файл приложения. Основная его задача - запуск, загрузка компонентов OWIN и корректное завершение.
Сервер: реализует спецификацию OWIN, выполняет наполнение словаря окружения из данных запроса и обрабатывает запрос на конвейере OWIN.
Промежуточное ПО или слой Middleware: набор компонентов, обрабатывающих запросы в конвейере OWIN.
И само приложение, выполняющее определенную задачу.
Что нам дает использование Katana в своих проектах? Katana позволяет создавать приложение, использующее различные веб-технологии, и запускать его где угодно. Посмотрим на простом примере.
В Visual Studio 2013 создадим новое приложение. В моем случае оно будет называться KatanaApp. В качестве шаблона приложения выберем шаблон Empty:
Итак, Visual Studio создаст абсолютно пустой проект. Функционал инфраструктуры OWIN содержится в библиотеке Microsoft.Owin.Host.SystemWeb. Для добавления библиотеки в проект воспользуемся менеджером NuGet:
Теперь добавим в проект класс запуска OWIN. Все приложения OWIN должны иметь подобный класс, в котором определяются компоненты конвейера приложения. Есть различные способы определения данного класса. Мы воспользуемся самым простым - просто добавим в проект соответствующий класс. Для этого нажмем правой кнопкой мыши на проект в окне Solution Explorer, в появившемся меню выберем Add->New Item... и в окне добавления нового компонента выберем OWIN Startup class:
Теперь изменим добавленный класс следующим образом:
using System; using System.Threading.Tasks; using Microsoft.Owin; using Owin; [assembly: OwinStartup(typeof(KatanaApp.Startup1))] namespace KatanaApp { public class Startup1 { public void Configuration(IAppBuilder app) { app.Run(context => { context.Response.ContentType = "text/html; charset=utf-8"; return context.Response.WriteAsync("<h2>Привет мир!</h2>"); }); } } }
Во-первых, чтобы приложение знало, где у нас находится класс OWIN Startup, мы используем атрибут [assembly: OwinStartup(typeof(KatanaApp.Startup1))]
.
Так, теперь оно знает, что таковым классом является KatanaApp.Startup1.
Этот класс содержит один метод Configuration, который в качестве параметра принимает интерфейс IAppBuilder.
Этот интерфейс и является тем промежуточным слоем middleware, который участвует в обработке запросов. Для обработки запроса объект IAppBuilder выполняет функцию Run,
которая имеет в качестве параметра делегат Func<IOwinContext,Task>. С помощью объекта context.Response
создаем ответ и посылаем его клиенту.
При запуске мы увидим в браузере нашу строку:
В данном случае в качестве веб-сервера выступил IIS, он же выступает в качестве хоста. Однако одной из сторон проекта Katana и OWIN является то, что приложение само будет выступать и в качестве хоста, и в качестве сервера.
В основе такой организации лежит класс HttpListener, который может прослушивать входящие http-запросы и отвечать на них. То есть фактически может выступать в качестве веб-сервера. И хотя мы в большей степени говорим о веб-приложениях в рамках ASP.NET MVC, но чтобы посмотреть преимущества OWIN, создадим простое консольное приложение в Visual Studio, например, в Visual Studio 2013 for Desktop.
Вначале добавим через NuGet библиотеку Microsoft.Owin.SelfHost:
Теперь добавим в консольное приложение вышеопределенный класс Startup1 (не забывая изменить пространство имен класса на пространство имен нашего приложения). И изменим код класса Program следующим образом:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace KatanaConsoleApp { class Program { static void Main(string[] args) { using (Microsoft.Owin.Hosting.WebApp.Start<Startup1>("http://localhost:8000")) { Console.WriteLine("Сервер запущен. Нажмите любую клавишу для завершения работы..."); Console.ReadLine(); } } } }
Теперь мы можем запустить приложение. Оно будет фактически работать как веб-сервер на 8000 порту, и в браузере мы можем обратиться к нему, набрав в адресной строке http://localhost:8000.
Мы рассмотрели общую концепцию проектов OWIN и Katana, но как же они применяются в MVC 5? При создании проекта ASP.NET MVC 5, использующего идентификацию пользователей, мы сможем заметить применение OWIN и Katana в приложении:
Во-первых, так как проект использует Katana, то в нем имеется файл Startup.cs с одноименным классом:
using Microsoft.Owin; using Owin; [assembly: OwinStartupAttribute(typeof(IdentityMvc.Startup))] namespace IdentityMvc { public partial class Startup { public void Configuration(IAppBuilder app) { ConfigureAuth(app); } } }
Этот тот же класс, что мы рассматривали ранее, только в данном случае он частичный (partial) и вызывает метод ConfigureAuth
. Этот
метод определен в другом файле - в файле Startup.Auth.cs, который находится в папке App_Start. В этом файле также находится определение частичного класса
Startup:
using Microsoft.AspNet.Identity; using Microsoft.Owin; using Microsoft.Owin.Security.Cookies; using Owin; namespace IdentityMvc { public partial class Startup { public void ConfigureAuth(IAppBuilder app) { app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Account/Login") }); app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); //app.UseMicrosoftAccountAuthentication( // clientId: "", // clientSecret: ""); //app.UseTwitterAuthentication( // consumerKey: "", // consumerSecret: ""); //app.UseFacebookAuthentication( // appId: "", // appSecret: ""); //app.UseGoogleAuthentication(); } } }
В методе ConfigureAuth производится аутентификация с помощью куки. По закомментированным строкам вы можете увидеть, что с помощью OWIN производится аутентификация с помощью внешних сервисов, таких как facebook, twitter и др. Кроме того, как мы дальше увидим, вся базовая система аутентификации и авторизации AspNet Identity базируется на компонентах OWIN и Katana.