使用依赖项注入来替换ASP.NET Core中的JWT Bearer选项



在web API中,我使用Jwt Auth进行安全保护,我有以下ConfigureServicesStartup.cs:

public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(this.Configuration.GetConnectionString("DefaultConnection")));
// Some additional application dependencies here with AddTransient()...
services.AddMvc();
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = "xxxxx";
options.RequireHttpsMetadata = false;
options.Audience = "xxxxx";
options.BackchannelHttpHandler = BackChannelHandler;
});
}

这里,BackChannelHandlerStartup.cs:的公共属性

public static HttpMessageHandler BackChannelHandler { get; set; }

我使用此属性的原因是,当我使用xUnit进行集成测试时,我在内存中使用Microsoft.AspNetCore.TestHost中的TestServer。所以,我需要像一样在TestFixture类中注册反向通道处理程序

testIdentityServer = new TestServer(identityServerBuilder);
My.Project.Startup.BackChannelHandler = testIdentityServer.CreateHandler();
testApiServer = new TestServer(apiServerBuilder);

虽然这很好,但我想覆盖DI容器中的services.AddAuthentication()AddJwtBearer(),这样我就可以注入身份验证中间件配置用于测试目的,而不是像处理任何其他依赖项那样使用公共静态属性。当我尝试使用时

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = "xxxxx";
options.RequireHttpsMetadata = false;
options.Audience = "xxxxx";
options.BackchannelHttpHandler = testIdentityServer.CreateHandler();
});

TestFixture.cs中,我得到错误:带有"Bearer token"的身份验证方案已经存在。

如何使用正确的ASP.NET Core来完成此操作?

您遇到的行为是正常的,因为同一身份验证方案不能有两个处理程序。这里,AddJwtBearer添加用于认证方案Bearer的处理程序,该值来自JwtBearerDefaults.AuthenticationScheme

传递给AddJwtBearer的lambda表达式被注册为命名选项配置,它注册的名称是身份验证方案。

以下是您在测试项目中可以做的事情:

services.PostConfigure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options =>
{
options.BackchannelHttpHandler = testIdentityServer.CreateHandler();
});

这样做不会更改已在容器中注册的身份验证方案,只会修改与JWT处理程序关联的选项。

最新更新