6

ASP.NET Core Web API를 사용하고 있는데 여기에는 여러 개의 독립적 인 웹 API 프로젝트가 있습니다. 컨트롤러의 액션을 실행하기 전에 로그인 한 사용자가 이미 다른 사용자 (내가 DB에서 얻을 수있는)를 가장하고 있는지 확인하고 가장 된 사용자 ID를 작업에 전달할 수 있는지 확인해야합니다.ASP.NET 핵심 미들웨어 컨트롤러에 매개 변수 전달

  • 나는 impesonated 사용자 가져 오기 요청 헤더
  • 에서 초기 사용자 로그인을 얻을 수있는 경우 ID :이 이후

    내가 그래서 미들웨어를 사용할 수있는 생각, 재사용 할거야 코드 조각입니다 어떤

  • 가 호출되는 API에 사용할 수 있도록 요청 파이프 라인에서 해당 ID를 주입
public class GetImpersonatorMiddleware 
{ 
    private readonly RequestDelegate _next; 
    private IImpersonatorRepo _repo { get; set; } 

    public GetImpersonatorMiddleware(RequestDelegate next, IImpersonatorRepo imperRepo) 
    { 
     _next = next; 
     _repo = imperRepo; 
    } 
    public async Task Invoke(HttpContext context) 
    { 
     //get user id from identity Token 
     var userId = 1; 

     int impersonatedUserID = _repo.GetImpesonator(userId); 

     //how to pass the impersonatedUserID so it can be picked up from controllers 
     if (impersonatedUserID > 0) 
      context.Request.Headers.Add("impers_id", impersonatedUserID.ToString()); 

     await _next.Invoke(context); 
    } 
} 

Question을 찾았지만 그게 내가 찾고있는 것을 해결하지 못했습니다.

매개 변수를 전달하고 요청 파이프 라인에서 매개 변수를 사용할 수있게하려면 어떻게해야합니까? 헤더에서 전달하는 것이 좋습니까? 아니면이를 수행하는보다 우아한 방법이 있습니까?

+0

당신은 요청 컨텍스트를 변경해야하지 파이프 라인 자체. –

+0

@LexLi, 예를 들어 자세히 설명해 주시겠습니까? 요청 자체에 정보를 추가하고 컨트롤러에서 가져 오는 것을 의미합니까? 그게 무슨 뜻인지, 나는 그것에 대해 생각하고 있었지만, 다시 말해서, 어디에서, 물결 무늬가 몸에 영향을 미치지 않을 것인가? – Coding

답변

6

당신은 파이프 라인 내에서 임의의 값을 전달 HttpContext.Items를 사용할 수 있습니다

context.Items["some"] = "value"; 
+3

참고 사항 : [HttpContext.Items 작업] (https://docs.microsoft.com/ko-kr/aspnet/core/fundamentals/app-state#working-with-httpcontextitems) – poke

0

더 나은 솔루션이 범위의 서비스를 사용하는 것입니다. 이것 좀보세요 : https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?tabs=aspnetcore2x#per-request-dependencies

귀하의 코드가 같아야합니다 :

public class MyMiddleware 
{ 
    private readonly RequestDelegate _next; 

    public MyMiddleware(RequestDelegate next) 
    { 
     _next = next; 
    } 

    public async Task Invoke(HttpContext httpContext, IImpersonatorRepo imperRepo) 
    { 
     imperRepo.MyProperty = 1000; 
     await _next(httpContext); 
    } 
} 

그리고 다음과 같이 ImpersonatorRepo 등록 :

services.AddScoped<IImpersonatorRepo, ImpersonatorRepo>()