【发布时间】:2021-11-10 06:31:10
【问题描述】:
我使用 .Net 5 创建了一个微服务,它有一些只能使用 jwtBearertoken 调用的端点。
StartUp 类中的 ConfigureServices 和 Configure 方法如下所示:
public void ConfigureServices(IServiceCollection services)
{
ConfigureDatabaseServices(services);
ConfigureMyProjectClasses(services);
services.AddVersioning();
services.AddControllers();
services.AddAuthentication(_configuration);
// Add framework services.
var mvcBuilder = services
.AddMvc()
.AddControllersAsServices();
ConfigureJsonSerializer(mvcBuilder);
}
public void Configure(
IApplicationBuilder app,
IWebHostEnvironment webEnv,
ILoggerFactory loggerFactory,
IHostApplicationLifetime applicationLifetime)
{
_logger = loggerFactory.CreateLogger("Startup");
try
{
app.Use(async (context, next) =>
{
var correlationId = Guid.NewGuid();
System.Diagnostics.Trace.CorrelationManager.ActivityId = correlationId;
context.Response.Headers.Add("X-Correlation-ID", correlationId.ToString());
await next();
});
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
applicationLifetime.ApplicationStopped.Register(() =>
{
LogManager.Shutdown();
});
}
catch (Exception e)
{
_logger.LogError(e.Message);
throw;
}
}
身份验证扩展:
public static class AuthenticationExtensions
{
public static void AddAuthentication(this IServiceCollection services, IConfiguration configuration)
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>
{
options.Authority = configuration["Authorization:Authority"];
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = false
};
});
}
}
我正在使用微服务的授权服务器来验证令牌。
在控制器上方添加[Authorize] 属性后,邮递员返回401 Unauthorized,而我在添加身份验证之前创建的集成测试也按预期返回Unauthorized。
现在我试图弄清楚如何通过添加 JwtBearerToken 并模拟来自授权服务器的响应来更改我的集成测试,以便我的测试将再次通过。
我怎样才能做到这一点?
【问题讨论】:
-
即使有可能,您也不应该模拟
Authorize属性。(我不确定这是否可能)集成测试的目标是测试实际的请求/响应。我认为你应该为你的测试生成一个令牌。 -
@AliReza 无意模拟
Authorize属性,我试图模拟添加 jwtbearertoken 并模拟授权服务器的响应 -
我知道我的意思是当您在管道中获得授权时,您的应用程序的行为可能会有所不同。最好在您的请求中包含令牌。但最后,如果你真的需要模拟授权。你必须开始模拟整个 DI