码迷,mamicode.com
首页 > Web开发 > 详细

ASP.NET Core 集成测试中模拟登录用户的一种姿势

时间:2019-11-13 16:22:15      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:信息   sync   一个   next   store   msi   builder   tor   asp   

不管哪种用户验证方式,最终都是在验证成功后设置 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);
    }
}

这样就轻松搞定了。 

ASP.NET Core 集成测试中模拟登录用户的一种姿势

标签:信息   sync   一个   next   store   msi   builder   tor   asp   

原文地址:https://www.cnblogs.com/dudu/p/11838952.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!