IIS 통합 파이프라인의 OWIN 미들웨어

작성자: Praburaj Thiagarajan, Rick Anderson

이 문서에서는 IIS 통합 파이프라인에서 OWIN OMC(미들웨어 구성 요소)를 실행하는 방법과 OMC가 실행되는 파이프라인 이벤트를 설정하는 방법을 보여 줍니다. 이 자습서를 읽기 전에 Project KatanaOWIN 시작 클래스 검색 개요를 검토해야 합니다. 이 자습서는 릭 앤더슨( @RickAndMSFT ), 크리스 로스, 프라부라지 티아가라얀, 하워드 디어킹( @howard_dierking )이 작성했습니다.

OWIN 미들웨어 구성 요소(OMC)는 주로 서버 중립적 파이프라인에서 실행되도록 설계되었지만 IIS 통합 파이프라인에서도 OMC를 실행할 수 있습니다(클래식 모드는 지원되지 않음). OMC는 PMC(패키지 관리자 콘솔)에서 다음 패키지를 설치하여 IIS 통합 파이프라인에서 작동하도록 만들 수 있습니다.

Install-Package Microsoft.Owin.Host.SystemWeb

즉, IIS 및 System.Web 외부에서 아직 실행할 수 없는 모든 애플리케이션 프레임워크도 기존 OWIN 미들웨어 구성 요소를 활용할 수 있습니다.

참고

Microsoft.Owin.Security.* Visual Studio 2013 새 ID 시스템과 함께 제공되는 모든 패키지(예: 쿠키, Microsoft 계정, Google, Facebook, Twitter, 전달자 토큰, OAuth, 권한 부여 서버, JWT, Azure Active Directory 및 Active Directory 페더레이션 서비스)는 OMC로 작성되며 자체 호스팅 및 IIS 호스팅 시나리오에서 모두 사용할 수 있습니다.

IIS 통합 파이프라인에서 OWIN 미들웨어가 실행되는 방법

OWIN 콘솔 애플리케이션의 경우 시작 구성 을 사용하여 빌드된 애플리케이션 파이프라인은 메서드를 사용하여 IAppBuilder.Use 구성 요소가 추가되는 순서에 따라 설정됩니다. 즉, Katana 런타임의 OWIN 파이프라인은 를 사용하여 IAppBuilder.Use등록된 순서대로 OMC를 처리합니다. IIS 통합 파이프라인에서 요청 파이프라인은 BeginRequest, AuthenticateRequest, AuthorizeRequest 등과 같은 미리 정의된 파이프라인 이벤트 집합을 구독하는 HttpModules로 구성됩니다. Microsoft.Owin.Host.SystemWeb nuget 패키지는 를 OwinHttpModule등록합니다. 일반적으로 는 HttpModule 파일을 통해 Web.config IIS에 등록되지만 Microsoft.Owin.Host.SystemWebHttpApplication.RegisterModule(Type) 라는 PreApplicationStartMethodAttribute IIS 기능을 사용하여 를 IIS 파이프라인에 동적으로 등록 OwinHttpModule 합니다.

OMC를 ASP.NET 세계의 HttpModule 과 비교하는 경우 OMC를 올바른 미리 정의된 파이프라인 이벤트에 등록해야 합니다. 예를 들어 요청이 파이프라인의 AuthenticateRequest 단계에 오면 HttpModule MyModule 이 호출됩니다.

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 런타임 코드는 시작 구성 을 검사하고 각 미들웨어 구성 요소를 통합 파이프라인 이벤트에 구독합니다. 예를 들어 다음 OMC 및 등록 코드를 사용하면 미들웨어 구성 요소의 기본 이벤트 등록을 볼 수 있습니다. (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 런타임은 기본적으로 IIS 파이프라인 이벤트 PreRequestHandlerExecute에 해당하는 PreExecuteRequestHandler에 각 OWIN 미들웨어 구성 요소를 매핑했습니다.

스테이지 표식

확장 메서드를 사용하여 파이프라인의 특정 단계에서 실행되도록 OMC를 표시할 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) 파이프라인의 인증 단계에서 실행되도록 이전에 등록된 모든 미들웨어 구성 요소(이 경우 두 진단 구성 요소)를 구성합니다. 마지막 미들웨어 구성 요소(진단 표시하고 요청에 응답)는 스테이지(ResolveRequestCache 이벤트)에서 ResolveCache 실행됩니다.

F5 키를 눌러 앱을 실행합니다. 출력 창에는 다음이 표시됩니다.

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

스테이지 표식 규칙

OMC(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. 기본적으로 OMC는 마지막 이벤트(PreHandlerExecute)에서 실행됩니다. 이것이 바로 첫 번째 예제 코드가 "PreExecuteRequestHandler"를 표시하는 이유입니다.

  2. 메서드를 app.UseStageMarker 사용하여 열거형에 나열된 OWIN 파이프라인의 모든 단계에서 이전에 실행할 OMC를 등록할 PipelineStage 수 있습니다.

  3. OWIN 파이프라인 및 IIS 파이프라인의 순서가 지정되므로 에 대한 app.UseStageMarker 호출은 순서에 따라야 합니다. 에 등록된 app.UseStageMarker마지막 이벤트 앞에 오는 이벤트로 이벤트 처리기를 설정할 수 없습니다. 예를 들어 다음을 호출 한 후 :

    app.UseStageMarker(PipelineStage.Authorize);
    

    전달 Authenticate 또는 PostAuthenticate 에 대한 app.UseStageMarker 호출은 적용되지 않으며 예외가 throw되지 않습니다. OMC는 최신 단계에서 실행되며 기본적으로 입니다 PreHandlerExecute. 스테이지 표식은 더 일찍 실행되도록 만드는 데 사용됩니다. 스테이지 표식을 순서대로 지정하면 이전 표식으로 반올림됩니다. 즉, 스테이지 표식을 추가하면 "X단계까지 실행"이 표시됩니다. OMC의 실행은 OWIN 파이프라인에서 추가된 초기 단계 마커에서 실행됩니다.

  4. 승리를 위한 호출 app.UseStageMarker 의 초기 단계입니다. 예를 들어 이전 예제에서 호출 순서 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
    

    마지막 OMC가 이벤트에 등록되고 Authenticate 이벤트가 다른 모든 이벤트보다 우선하기 때문에 OMC는 모두 스테이지에서 AuthenticateRequestAuthenticate 실행됩니다.