使っています ASP.NET Core Web API
、複数の独立したWeb APIプロジェクトがあります。コントローラーのアクションを実行する前に、ログインしたユーザーが他のユーザー(DB
から取得できる)になりすましているかどうかを確認し、偽装したユーザーId
をactions
。
これは再利用されるコードの一部であるため、ミドルウェアを使用できると思いました。
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ヘッダーで渡すか、これを行うよりエレガントな方法はありますか?
HttpContext.Itemsを使用して、パイプライン内で任意の値を渡すことができます。
context.Items["some"] = "value";
より良いソリューションは、スコープサービスを使用することです。これを見てください: 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>()