IIS 통합 파이프라인에서 미들웨어 OWINOWIN Middleware in the IIS integrated pipeline

Praburaj Thiagarajan, Rick Andersonby Praburaj Thiagarajan, Rick Anderson

이 문서에서는 IIS 통합 파이프라인에서 OMCs (OWIN 미들웨어 구성 요소)를 실행 하는 방법과 OMCS가 실행 되는 파이프라인 이벤트를 설정 하는 방법을 보여 줍니다.This article shows how to run OWIN middleware Components (OMCs) in the IIS integrated pipeline, and how to set the pipeline event an OMC runs on. 이 자습서를 읽기 전에 Project Katana 및 OWIN Startup 클래스 검색 의 개요 를 검토 해야 합니다.You should review An Overview of Project Katana and OWIN Startup Class Detection before reading this tutorial. 이 자습서는 Rick Anderson ( @RickAndMSFT ), Chris Ross, Praburaj Thiagarajan 및 Howard Dierking ( @howard_Dierking )에 의해 작성 되었습니다.This tutorial was written by Rick Anderson ( @RickAndMSFT ), Chris Ross, Praburaj Thiagarajan, and Howard Dierking ( @howard_dierking ).

OMCs ( OWIN 미들웨어 구성 요소)는 주로 서버 독립적 파이프라인에서 실행 되도록 설계 되었지만 IIS 통합 파이프라인 에서도 omcs를 실행할 수 있습니다 (클래식 모드는 지원 되지 않음 ).Although OWIN middleware components (OMCs) are primarily designed to run in a server-agnostic pipeline, it is possible to run an OMC in the IIS integrated pipeline as well (classic mode is not supported). PMC (패키지 관리자 콘솔)에서 다음 패키지를 설치 하 여 IIS 통합 파이프라인에서 OMC를 수행할 수 있습니다.An OMC can be made to work in the IIS integrated pipeline by installing the following package from the Package Manager Console (PMC):

Install-Package Microsoft.Owin.Host.SystemWeb

즉, IIS 및 System.web 외부에서 아직 실행할 수 없는 응용 프로그램 프레임 워크를 비롯 한 모든 응용 프로그램 프레임 워크는 기존 OWIN 미들웨어 구성 요소를 활용할 수 있습니다.This means that all application frameworks, even those that are not yet able to run outside of IIS and System.Web, can benefit from existing OWIN middleware components.

Note

Visual Studio 2013에서 새 Id 시스템으로 전달 되는 모든 Microsoft.Owin.Security.* 패키지 (예: 쿠키, Microsoft 계정, Google, Facebook, Twitter, 전달자 토큰, OAuth, 권한 부여 서버, JWT, Azure active Directory 및 Active directory federation services)가 omcs로 작성 되 고 자체 호스팅 및 IIS에서 호스팅되는 시나리오에서 모두 사용할 수 있습니다.All of the Microsoft.Owin.Security.* packages shipping with the new Identity System in Visual Studio 2013 (for example: Cookies, Microsoft Account, Google, Facebook, Twitter, Bearer Token, OAuth, Authorization server, JWT, Azure Active directory, and Active directory federation services) are authored as OMCs, and can be used in both self-hosted and IIS-hosted scenarios.

IIS 통합 파이프라인에서 OWIN 미들웨어를 실행 하는 방법How OWIN Middleware Executes in the IIS Integrated Pipeline

OWIN 콘솔 응용 프로그램의 경우 시작 구성을 사용 하 여 작성 된 응용 프로그램 파이프라인은 IAppBuilder.Use 메서드를 사용 하 여 구성 요소를 추가 하는 순서에 따라 설정 됩니다.For OWIN console applications, the application pipeline built using the startup configuration is set by the order the components are added using the IAppBuilder.Use method. 즉, Katana 런타임의 OWIN 파이프라인은 IAppBuilder.Use를 사용 하 여 등록 된 순서로 omcs를 처리 합니다.That is, the OWIN pipeline in the Katana runtime will process OMCs in the order they were registered using IAppBuilder.Use. IIS 통합 파이프라인에서 요청 파이프라인은 BeginRequest, AuthenticateRequest, AuthorizeRequest등과 같은 파이프라인 이벤트의 미리 정의 된 집합을 구독 하는 HttpModules 로 구성 됩니다.In the IIS integrated pipeline the request pipeline consists of HttpModules subscribed to a pre-defined set of the pipeline events such as BeginRequest, AuthenticateRequest, AuthorizeRequest, etc.

OMC를 ASP.NET 세계의 HttpModule 과 비교 하는 경우 omc를 올바른 미리 정의 된 파이프라인 이벤트에 등록 해야 합니다.If we compare an OMC to that of an HttpModule in the ASP.NET world, an OMC must be registered to the correct pre-defined pipeline event. 예를 들어, 요청을 파이프라인의 AuthenticateRequest 단계로 가져올 때 HttpModule MyModule 호출 됩니다.For example, the HttpModule MyModule will get invoked when a request comes to the AuthenticateRequest stage in the pipeline:

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.
    }
}

OMC가 이와 동일한 이벤트 기반 실행 순서에 참여 하도록 하기 위해 Katana 런타임 코드는 시작 구성을 검색 하 고 각 미들웨어 구성 요소를 통합 파이프라인 이벤트에 등록 합니다.In order for an OMC to participate in this same, event-based execution ordering, the Katana runtime code scans through the startup configuration and subscribes each of the middleware components to an integrated pipeline event. 예를 들어 다음 OMC 및 등록 코드를 사용 하 여 미들웨어 구성 요소의 기본 이벤트 등록을 확인할 수 있습니다.For example, the following OMC and registration code enables you to see the default event registration of middleware components. OWIN 시작 클래스를 만드는 방법에 대 한 자세한 내용은 OWIN Startup 클래스 검색을 참조 하세요.(For more detailed instructions on creating an OWIN startup class, see OWIN Startup Class Detection.)

  1. 빈 웹 응용 프로그램 프로젝트를 만들고 이름을 owin2로 만듭니다.Create an empty web application project and name it owin2.

  2. 패키지 관리자 콘솔 (PMC)에서 다음 명령을 실행 합니다.From the Package Manager Console (PMC), run the following command:

    Install-Package Microsoft.Owin.Host.SystemWeb
    
  3. OWIN Startup Class를 추가 하 고 이름을 Startup로 이름을 추가 합니다.Add an OWIN Startup Class and name it Startup. 생성 된 코드를 다음으로 바꿉니다 (변경 내용이 강조 표시 됨).Replace the generated code with the following (the changes are highlighted):

    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 키를 눌러 앱을 실행 합니다.Hit F5 to run the app.

시작 구성은 세 가지 미들웨어 구성 요소를 사용 하 여 파이프라인을 설정 하 고 처음 두 개는 진단 정보를 표시 하 고 마지막에는 이벤트에 응답 하 고 진단 정보를 표시 합니다.The Startup configuration sets up a pipeline with three middleware components, the first two displaying diagnostic information and the last one responding to events (and also displaying diagnostic information). PrintCurrentIntegratedPipelineStage 메서드는이 미들웨어가 호출 되는 통합 파이프라인 이벤트와 메시지를 표시 합니다.The PrintCurrentIntegratedPipelineStage method displays the integrated pipeline event this middleware is invoked on and a message. 출력 창에 다음이 표시 됩니다.The output windows displays the following:

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

Katana 런타임은 IIS 파이프라인 이벤트 PreRequestHandlerExecute에 해당 하는, 기본적으로 각 OWIN 미들웨어 구성 요소를 preexecuterto esthandler 에 매핑합니다.The Katana runtime mapped each of the OWIN middleware components to PreExecuteRequestHandler by default, which corresponds to the IIS pipeline event PreRequestHandlerExecute.

스테이지 표식Stage Markers

IAppBuilder UseStageMarker() 확장 메서드를 사용 하 여 특정 파이프라인 단계에서 OMCs를 실행 하도록 표시할 수 있습니다.You can mark OMCs to execute at specific stages of the pipeline by using the IAppBuilder UseStageMarker() extension method. 특정 단계에서 미들웨어 구성 요소 집합을 실행 하려면 등록 하는 동안 마지막 구성 요소가 설정 된 직후에 스테이지 표식을 삽입 합니다.To run a set of middleware components during a particular stage, insert a stage marker right after the last component is the set during registration. 미들웨어를 실행 하 고 주문 구성 요소를 실행 해야 하는 파이프라인 단계에 대 한 규칙이 있습니다 (규칙은 자습서의 뒷부분에 설명 되어 있음).There are rules on which stage of the pipeline you can execute middleware and the order components must run (The rules are explained later in the tutorial). 아래와 같이 Configuration 코드에 UseStageMarker 메서드를 추가 합니다.Add the UseStageMarker method to the Configuration code as shown below:

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) 호출은 이전에 등록 된 미들웨어 구성 요소 (이 경우 두 개의 진단 구성 요소)를 파이프라인의 인증 단계에서 실행 하도록 구성 합니다.The app.UseStageMarker(PipelineStage.Authenticate) call configures all the previously registered middleware components (in this case, our two diagnostic components) to run on the authentication stage of the pipeline. 마지막 미들웨어 구성 요소 (진단 정보를 표시 하 고 요청에 응답)는 ResolveCache 단계 ( ResolveRequestCache 이벤트)에서 실행 됩니다.The last middleware component (which displays diagnostics and responds to requests) will run on the ResolveCache stage (the ResolveRequestCache event).

F5 키를 눌러 앱을 실행 합니다. 출력 창에 다음이 표시 됩니다.Hit F5 to run the app.The output window shows the following:

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

스테이지 표식 규칙Stage Marker Rules

OMC (Owin 미들웨어 구성 요소)는 다음 OWIN 파이프라인 단계 이벤트에서 실행 되도록 구성할 수 있습니다.Owin middleware components (OMC) can be configured to run at the following OWIN pipeline stage events:

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. 기본적으로 OMCs는 마지막 이벤트 (PreHandlerExecute)에서 실행 됩니다.By default, OMCs run at the last event (PreHandlerExecute). 이 때문에 첫 번째 예제 코드는 "Preexecuterto Esthandler"로 표시 됩니다.That's why our first example code displayed "PreExecuteRequestHandler".

  2. app.UseStageMarker 메서드를 사용 하 여 PipelineStage 열거형에 나열 된 OWIN 파이프라인의 모든 단계에서 이전에 실행 되도록 OMC를 등록할 수 있습니다.You can use the a app.UseStageMarker method to register a OMC to run earlier, at any stage of the OWIN pipeline listed in the PipelineStage enum.

  3. OWIN 파이프라인과 IIS 파이프라인은 순서 대로 정렬 되므로 app.UseStageMarker 호출은 순서 대로 되어 있어야 합니다.The OWIN pipeline and the IIS pipeline is ordered, therefore calls to app.UseStageMarker must be in order. 에 등록 된 마지막 이벤트 앞에 있는 이벤트에 이벤트 처리기를 설정 하 여 app.UseStageMarker수 없습니다.You cannot set the event handler to an event that precedes the last event registered with to app.UseStageMarker. 예를 들어를 호출한 :For example, after calling:

    app.UseStageMarker(PipelineStage.Authorize);
    

    Authenticate 또는 PostAuthenticate를 전달 하는 app.UseStageMarker에 대 한 호출은 적용 되지 않으며 예외가 throw 되지 않습니다.calls to app.UseStageMarker passing Authenticate or PostAuthenticate will not be honored, and no exception will be thrown. OMCs는 기본적으로 PreHandlerExecute된 최신 단계에서 실행 됩니다.OMCs run at the latest stage, which by default is PreHandlerExecute. 스테이지 마커는 이전에 실행 되도록 하는 데 사용 됩니다.The stage markers are used to make them to run earlier. 스테이지 표식을 순서 대로 지정 하면 이전 마커로 반올림 됩니다.If you specify stage markers out of order, we round to the earlier marker. 즉, 스테이지 마커를 추가 하는 것은 "단계 X 보다 나중에 실행"을 의미 합니다.In other words, adding a stage marker says "Run no later than stage X". OMC는 OWIN 파이프라인에 추가 된 가장 이른 스테이지 표식에서 실행 됩니다.OMC's run at the earliest stage marker added after them in the OWIN pipeline.

  4. app.UseStageMarker에 대 한 가장 이른 호출 단계입니다.The earliest stage of calls to app.UseStageMarker wins. 예를 들어 이전 예제에서 app.UseStageMarker 호출의 순서를 전환 하는 경우 다음과 같습니다.For example, if you switch the order of app.UseStageMarker calls from our previous example:

    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);
    }
    

    출력 창에 다음이 표시 됩니다.The output window will display:

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

    OMCs는 Authenticate 이벤트에 마지막 OMCS가 등록 되어 있고 Authenticate 이벤트가 다른 모든 이벤트 앞에 있기 때문에 AuthenticateRequest 단계에서 실행 됩니다.The OMCs all run in the AuthenticateRequest stage, because the last OMC registered with the Authenticate event, and the Authenticate event precedes all other events.