不管哪種用戶驗證方式,最終都是在驗證成功后設置 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); } }
這樣就輕松搞定了。