web-dev-qa-db-ja.com

コントローラーにパラメーターを渡すASP.NET Coreミドルウェア

使っています ASP.NET Core Web API、複数の独立したWeb APIプロジェクトがあります。コントローラーのアクションを実行する前に、ログインしたユーザーが他のユーザー(DBから取得できる)になりすましているかどうかを確認し、偽装したユーザーIdactions

これは再利用されるコードの一部であるため、ミドルウェアを使用できると思いました。

  • リクエストヘッダーから最初のユーザーログインを取得できます
  • 禁固化されたユーザー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);
    }
}

私はこれを見つけました 質問 が、それは私が探しているものに対処しませんでした。

パラメータを渡してリクエストパイプラインで利用できるようにするにはどうすればよいですか? Okヘッダーで渡すか、これを行うよりエレガントな方法はありますか?

17
Hussein Salman

HttpContext.Itemsを使用して、パイプライン内で任意の値を渡すことができます。

context.Items["some"] = "value";
12
Ricardo Peres

より良いソリューションは、スコープサービスを使用することです。これを見てください: 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>()
7
Motumbo