不管哪种用户验证方式,最终都是在验证成功后设置 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); } }
这样就轻松搞定了。