ASP.NET Core 集成測試中模擬登錄用戶的一種姿勢


不管哪種用戶驗證方式,最終都是在驗證成功后設置 HttpContext.User ,后續處理環節通過 HttpContext.User 獲取用戶信息。如果能直接修改 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<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
    {
        return app =>
        {
            //app.Use(...);
            next(app);
        };
    }
}

最后通過重寫 WebApplicationFactory 的 ConfigureWebHost 方法注冊 IStartupFilter 的實現。

public class StoreWebAppFactory : WebApplicationFactory<Startup>
{
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder.ConfigureServices(services =>
        {
            services.AddTransient<IStartupFilter, FakeUserStartupFilter>();
        });

        base.ConfigureWebHost(builder);
    }
}

這樣就輕松搞定了。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM