По промежуточного слоя OWIN в интегрированном конвейере IIS

Прабураж сиагаражан, Рик Андерсон (

В этой статье показано, как запускать компоненты по промежуточного слоя OWIN (ОМКС) в конвейере, интегрированном со службами IIS, и как задать событие конвейера, на котором выполняется ОМК. Прежде чем читать этот учебник, ознакомьтесь с обзором определения класса Katana и типа запуска OWIN . Этот учебник написан на Рик Андерсон (( @RickAndMSFT ), Крис Росс (, прабураж Сиагаражан и Говард дайеркинг ( @howard_Дайеркинг ).

Хотя компоненты промежуточного слоя OWIN (ОМКС) в основном предназначены для работы в независимом от сервера конвейере, в интегрированном конвейере IIS можно также запустить ОМК (классический режим не поддерживается). ОМК можно сделать для работы в конвейере, интегрированном со службами IIS, установив следующий пакет из консоли диспетчера пакетов (PMC):

Install-Package Microsoft.Owin.Host.SystemWeb

Это означает, что все платформы приложений, даже те, которые еще не могут работать вне IIS и System. Web, могут воспользоваться преимуществами существующих компонентов по промежуточного слоя OWIN.

Note

Все Microsoft.Owin.Security.* пакеты, поставляемые с новой системой идентификации в Visual Studio 2013 (например, файлы cookie, учетная запись Майкрософт, Google, Facebook, Twitter, маркер носителя, OAuth, сервер авторизации, JWT, Azure Active Directory и службы федерации Active Directory), создаются как Омкс и могут использоваться как в самостоятельно размещенных, так и в размещенных в IIS сценариях.

Как выполняется по промежуточного слоя OWIN в интегрированном конвейере IIS

Для консольных приложений OWIN конвейер приложений, созданный с помощью конфигурации запуска , задается порядком добавления компонентов с помощью метода IAppBuilder.Use. То есть конвейер OWIN в среде выполнения Katana будет обрабатывать Омкс в том порядке, в котором они были зарегистрированы с помощью IAppBuilder.Use. В конвейере интеграции IIS конвейер запросов состоит из HttpModule , подписанных на предварительно определенный набор событий конвейера, таких как beginRequest, AuthenticateRequest, AuthorizeRequestи т. д.

Если сравнить ОМК с объектом HttpModule в ASP.NET мире, то ОМК должен быть зарегистрирован в правильном предварительно определенном событии конвейера. Например, MyModule HttpModule будет вызываться, когда запрос поступает на стадию AuthenticateRequest в конвейере:

public class MyModule : IHttpModule
{
    public void Dispose()
    {
        //clean-up code here.
    }
    public void Init(HttpApplication context)
    {
        // An example of how you can handle AuthenticateRequest events.
        context.AuthenticateRequest += ctx_AuthRequest;
    }
    void ctx_AuthRequest(object sender, EventArgs e)
    {
        // Handle event.
    }
}

Чтобы ОМК мог участвовать в таком же порядке выполнения на основе событий, код среды выполнения Katana просматривает конфигурацию запуска и подписывает каждый из компонентов по промежуточного слоя в интегрированное событие конвейера. Например, следующий ОМК и код регистрации позволяют просматривать регистрацию событий по умолчанию для компонентов по промежуточного слоя. (Более подробные инструкции по созданию класса запуска OWIN см. в разделе Обнаружение класса запуска OWIN.)

  1. Создайте пустой проект веб-приложения и назовите его owin2.

  2. В консоли диспетчера пакетов (PMC) выполните следующую команду:

    Install-Package Microsoft.Owin.Host.SystemWeb
    
  3. Добавьте OWIN Startup Class и присвойте ему имя Startup. Замените созданный код следующим (изменения выделены):

    using System;
    using System.Threading.Tasks;
    using Microsoft.Owin;
    using Owin;
    using System.Web;
    using System.IO;
    using Microsoft.Owin.Extensions;
    [assembly: OwinStartup(typeof(owin2.Startup))]
    namespace owin2
    {
        public class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                app.Use((context, next) =>
                {
                    PrintCurrentIntegratedPipelineStage(context, "Middleware 1");
                    return next.Invoke();
                });
                app.Use((context, next) =>
                {
                    PrintCurrentIntegratedPipelineStage(context, "2nd MW");
                    return next.Invoke();
                }); 
                app.Run(context =>
                {
                    PrintCurrentIntegratedPipelineStage(context, "3rd MW");
                    return context.Response.WriteAsync("Hello world");
                });            
            }
            private void PrintCurrentIntegratedPipelineStage(IOwinContext context, string msg)
            {
                var currentIntegratedpipelineStage = HttpContext.Current.CurrentNotification;
                context.Get<TextWriter>("host.TraceOutput").WriteLine(
                    "Current IIS event: " + currentIntegratedpipelineStage
                    + " Msg: " + msg);
            }
        }
    }
    
  4. Нажмите клавишу F5, чтобы запустить приложение.

Конфигурация запуска настраивает конвейер с тремя компонентами по промежуточного слоя, первые два отображения диагностических сведений и Последнее реагирование на события (а также отображение диагностической информации). Метод PrintCurrentIntegratedPipelineStage отображает событие интегрированного конвейера, которое вызывается этим по промежуточного слоя и сообщением. Выходные окна выводят следующие данные:

Current IIS event: PreExecuteRequestHandler Msg: Middleware 1
Current IIS event: PreExecuteRequestHandler Msg: 2nd MW
Current IIS event: PreExecuteRequestHandler Msg: 3rd MW

Среда выполнения Katana сопоставила каждый из компонентов по промежуточного слоя OWIN в приксекутерекуессандлер по умолчанию, что соответствует событию конвейера IIS PreRequestHandlerExecute.

Маркеры этапа

Можно пометить Омкс для выполнения на конкретных стадиях конвейера с помощью метода расширения IAppBuilder UseStageMarker(). Чтобы запустить набор компонентов по промежуточного слоя на определенном этапе, вставьте маркер этапа сразу после последнего компонента, установленного во время регистрации. Существуют правила, на которых этап конвейера можно выполнить по промежуточного слоя и компоненты заказа, которые должны быть выполнены (правила объясняются далее в этом руководстве). Добавьте метод UseStageMarker в код Configuration, как показано ниже:

public void Configuration(IAppBuilder app)
{
    app.Use((context, next) =>
    {
        PrintCurrentIntegratedPipelineStage(context, "Middleware 1");
        return next.Invoke();
    });
    app.Use((context, next) =>
    {
        PrintCurrentIntegratedPipelineStage(context, "2nd MW");
        return next.Invoke();
    });
    app.UseStageMarker(PipelineStage.Authenticate);
    app.Run(context =>
    {
        PrintCurrentIntegratedPipelineStage(context, "3rd MW");
        return context.Response.WriteAsync("Hello world");
    });
    app.UseStageMarker(PipelineStage.ResolveCache);
}

app.UseStageMarker(PipelineStage.Authenticate) вызов настраивает все ранее зарегистрированные компоненты по промежуточного слоя (в данном случае два компонента диагностики) для запуска на этапе проверки подлинности конвейера. Последний компонент по промежуточного слоя (который отображает диагностику и реагирует на запросы) будет выполняться на ResolveCache этапе (событие ресолверекуесткаче ).

Нажмите клавишу F5, чтобы запустить приложение. В окне Вывод отображается следующее:

Current IIS event: AuthenticateRequest Msg: Middleware 1
Current IIS event: AuthenticateRequest Msg: 2nd MW
Current IIS event: ResolveRequestCache Msg: 3rd MW

Правила маркера этапа

Компоненты промежуточного слоя Owin (ОМК) можно настроить для запуска в следующих событиях этапа конвейера OWIN:

public enum PipelineStage
{
    Authenticate = 0,
    PostAuthenticate = 1,
    Authorize = 2,
    PostAuthorize = 3,
    ResolveCache = 4,
    PostResolveCache = 5,
    MapHandler = 6,
    PostMapHandler = 7,
    AcquireState = 8,
    PostAcquireState = 9,
    PreHandlerExecute = 10,
}
  1. По умолчанию Омкс выполняется в последнем событии (PreHandlerExecute). Именно поэтому наш первый пример кода выводит «Приксекутерекуессандлер».

  2. Можно использовать метод app.UseStageMarker, чтобы зарегистрировать ОМК для выполнения ранее, на любом этапе конвейера OWIN, указанном в перечислении PipelineStage.

  3. Конвейер OWIN и конвейер IIS упорядочены, поэтому вызовы app.UseStageMarker должны выполняться по порядку. Обработчику событий нельзя присвоить событие, которое предшествует последнему событию, зарегистрированному в app.UseStageMarker. Например, после вызова:

    app.UseStageMarker(PipelineStage.Authorize);
    

    вызовы app.UseStageMarker, передающие Authenticate или PostAuthenticate, не будут учитываться и исключения не будут выдаваться. Омкс запускается на последнем этапе, по умолчанию PreHandlerExecute. Маркеры этапа используются для того, чтобы они выполнялись раньше. Если маркеры этапа заданы не по порядку, мы округляем до более раннего маркера. Иными словами, при добавлении маркера этапа будет указано "выполнять не позднее, чем на этапе X". ОМК запускается на более раннем маркере этапа, добавленном после них в конвейере OWIN.

  4. Самый ранний этап вызовов app.UseStageMarker WINS. Например, при переключении порядка вызовов app.UseStageMarker из нашего предыдущего примера:

    public void Configuration(IAppBuilder app)
    {
        app.Use((context, next) =>
        {
            PrintCurrentIntegratedPipelineStage(context, "Middleware 1");
            return next.Invoke();
        });
        app.Use((context, next) =>
        {
            PrintCurrentIntegratedPipelineStage(context, "2nd MW");
            return next.Invoke();
        });
        app.UseStageMarker(PipelineStage.ResolveCache);
        app.Run(context =>
        {
            PrintCurrentIntegratedPipelineStage(context, "3rd MW");
            return context.Response.WriteAsync("Hello world");
        });
        app.UseStageMarker(PipelineStage.Authenticate);
    }
    

    В окне вывода отобразятся следующие данные:

    Current IIS event: AuthenticateRequest Msg: Middleware 1
    Current IIS event: AuthenticateRequest Msg: 2nd MW
    Current IIS event: AuthenticateRequest Msg: 3rd MW
    

    Омкс все выполняется на этапе AuthenticateRequest, поскольку последняя ОМК, зарегистрированная в событии Authenticate, и событие Authenticate предшествуют всем остальным событиям.