6

我正在使用ASP.NET Core Web API,其中有多個獨立的Web API項目。在執行任何控制器的操作之前,我必須檢查登錄的用戶是否已經模擬其他用戶(我可以從數據庫中獲取)並可以將模擬的用戶標識傳遞給操作。ASP.NET核心中間件將參數傳遞給控制器​​

由於這是一個一段代碼,要被重新使用,以爲可以使用一箇中間件,以便:

  • 我可以從請求頭
  • 的初始用戶登錄獲取impesonated用戶ID,如果任何
  • 注入在請求管道該ID將其提供給API調用
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,你可以請一個例子詳細說明,你的意思是添加一些信息到請求本身並從控制器獲取?如果那是你的意思,我正在考慮這個問題,但是又一次,querysting,body,會不會影響被調用的action? – Coding

回答

6

您可以使用HttpContext.Items通過管道內任意值:

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

另請參閱:[使用HttpContext.Items](https://docs.microsoft.com/en-us/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>() 
相關問題