6

Korzystam z interfejsu ASP.NET Core Web API, w którym mam wiele niezależnych projektów internetowych. Przed wykonaniem któregokolwiek z działań kontrolerów, muszę sprawdzić, czy zalogowany użytkownik podszywa się pod innego użytkownika (który mogę uzyskać od DB) i może przekazać identyfikator podanego użytkownika do akcji.ASP.NET Core Middleware przekazujące parametry do kontrolerów

Ponieważ jest to fragment kodu, który będzie ponownie wykorzystane, pomyślałem mogę używać middleware więc:

  • mogę uzyskać wstępną logowanie użytkownika z nagłówka żądania
  • Pobierz impesonated ID użytkownika, jeśli każdy
  • wstrzyknąć ten identyfikator w żądaniu rurociągu do udostępnienia API miano
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); 
    } 
} 

Znalazłem to Question, ale to nie rozwiązało tego, czego szukam.

Jak mogę przekazać parametr i udostępnić go w potoku żądania? Czy dobrze jest przekazać go w nagłówku, czy jest na to bardziej elegancki sposób?

+0

należy zmienić kontekst żądania, a nie samego rurociągu. –

+0

@LexLi, czy możesz wyjaśnić na przykładzie, Czy chodzi ci o dodanie pewnych informacji do samego żądania i uzyskanie tego z kontrolera? Jeśli to, co miałeś na myśli, myślałem o tym, ale znowu, gdzie, kwerenda, ciało, nie wpłynęłoby to na wywołane działanie? – Coding

Odpowiedz

6

Można użyć HttpContext.Items przekazać dowolne wartości wewnątrz rurociągu:

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

Zobacz też: [Praca z HttpContext.Items] (https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state#working-with-httpcontextitems) – poke

0

Lepszym rozwiązaniem byłoby użyć scoped usługi. Spójrz na to: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?tabs=aspnetcore2x#per-request-dependencies

Kod powinien wyglądać następująco:

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

A potem zarejestrować ImpersonatorRepo jak:

services.AddScoped<IImpersonatorRepo, ImpersonatorRepo>()