IIS 통합 파이프라인의 OWIN 미들웨어
작성자: Praburaj Thiagarajan, Rick Anderson
이 문서에서는 IIS 통합 파이프라인에서 OWIN OMC(미들웨어 구성 요소)를 실행하는 방법과 OMC가 실행되는 파이프라인 이벤트를 설정하는 방법을 보여 줍니다. 이 자습서를 읽기 전에 Project Katana 및 OWIN 시작 클래스 검색 개요를 검토해야 합니다. 이 자습서는 릭 앤더슨( @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.SystemWeb
및 HttpApplication.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 시작 클래스 검색을 참조하세요.)
빈 웹 애플리케이션 프로젝트를 만들고 이름을 owin2로 지정합니다.
PMC(패키지 관리자 콘솔)에서 다음 명령을 실행합니다.
Install-Package Microsoft.Owin.Host.SystemWeb
를
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); } } }
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,
}
기본적으로 OMC는 마지막 이벤트(
PreHandlerExecute
)에서 실행됩니다. 이것이 바로 첫 번째 예제 코드가 "PreExecuteRequestHandler"를 표시하는 이유입니다.메서드를
app.UseStageMarker
사용하여 열거형에 나열된 OWIN 파이프라인의 모든 단계에서 이전에 실행할 OMC를 등록할PipelineStage
수 있습니다.OWIN 파이프라인 및 IIS 파이프라인의 순서가 지정되므로 에 대한
app.UseStageMarker
호출은 순서에 따라야 합니다. 에 등록된app.UseStageMarker
마지막 이벤트 앞에 오는 이벤트로 이벤트 처리기를 설정할 수 없습니다. 예를 들어 다음을 호출 한 후 :app.UseStageMarker(PipelineStage.Authorize);
전달
Authenticate
또는PostAuthenticate
에 대한app.UseStageMarker
호출은 적용되지 않으며 예외가 throw되지 않습니다. OMC는 최신 단계에서 실행되며 기본적으로 입니다PreHandlerExecute
. 스테이지 표식은 더 일찍 실행되도록 만드는 데 사용됩니다. 스테이지 표식을 순서대로 지정하면 이전 표식으로 반올림됩니다. 즉, 스테이지 표식을 추가하면 "X단계까지 실행"이 표시됩니다. OMC의 실행은 OWIN 파이프라인에서 추가된 초기 단계 마커에서 실행됩니다.승리를 위한 호출
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는 모두 스테이지에서AuthenticateRequest
Authenticate
실행됩니다.
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기