ASP.NET Core統合テストでログインユーザーをシミュレートする姿勢

3055 ワード

いずれのユーザ認証方式においても、最終的には認証に成功した後にHttpContextを設定する.User、後続の処理段階はHttpContext.を通過する.ユーザー情報を取得します.HttpContext.を直接修正できればUserは、アナログログインの目的を達成することができ、ASP.NET Coreのミドルウェア(middleware)は生まれながらにしてHttpContextを任意に修正できる能力を備えており、この考えを実現するのに苦労しない.
まず、アナログログインユーザを実装し、HttpContextを変更する.Userのミドルウェア.
app.Use(async (context, next) =>
{
    var claims = new Claim[] { new Claim(ClaimTypes.Name, "cnblogs") };
    var claimsIdentity = new ClaimsIdentity(claims, "Basic");
    var claimsPrincipal = new ClaimsPrincipal(claimsIdentity);
    context.User = claimsPrincipal;
    await next();
});
そして、上記のミドルウェアをIStartupFilterで登録することで、Startupよりも先に確保することができる.Configureに登録されているミドルウェア.
public class FakeUserStartupFilter : IStartupFilter
{
    public Action Configure(Action next)
    {
        return app =>
        {
            //app.Use(...);
            next(app);
        };
    }
}
最後にWebApplicationFactoryのConfigureWebHostメソッドを書き換えることでIStartupFilterのインプリメンテーションを登録します.
public class StoreWebAppFactory : WebApplicationFactory
{
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder.ConfigureServices(services =>
        {
            services.AddTransient();
        });

        base.ConfigureWebHost(builder);
    }
}
これで楽にできました.