ASP.NET Core 集成测试中的身份验证失败(401 未经授权)

saw*_*wie 5 c# authentication integration-testing asp.net-core

我正在为我们的 ECM 开发一个基于 IT HIT WebDAV 引擎和 ASP.NET Core 5 的 WebDAV 界面
。WebDAV 服务器应该支持基本和 Windows 身份验证。
在标准身份验证中间件之后,我调用另一个自定义中间件来进行进一步检查:

Startup.cs:
public void Configure(IApplicationBuilder app)
{
    ...
    app.UseAuthentication();
    app.UseMySpecialAuthenticationValidator();
    ...
}
Run Code Online (Sandbox Code Playgroud)

MySpecialAuthenticationValidator 具有以下 InvokeAsync 方法:

public async Task InvokeAsync(HttpContext context)
{
    if (!context.Request.Headers.ContainsKey(HeaderNames.Authorization))
    {
        Logger.LogDebug("Unauthorized access - challenge");
        await context.ChallengeAsync();
        return;
    }
    else
    {
        // if sending a request with Postman using Basic auth, IsAuthenticated is true
        // if sending a request from my integration test using Basic auth, IsAuthenticated is false
        if (context.User.Identity.IsAuthenticated)
        {
            // do something useful
            ...
        }
        else
        {
            Logger.LogError("Unauthorized access - User not found");
            context.User = new ClaimsPrincipal();
            context.Response.StatusCode = 401;
            return;
        }

        await Next(context);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我迄今为止唯一的测试类:

public class WebDavTests : IClassFixture<WebApplicationFactory<Startup>>
{
    private readonly HttpClient _HttpClient;
    private string base64EncodedSecret = ...

    public WebDavTests(WebApplicationFactory<Startup> factory)
    {
        this._HttpClient = factory.CreateDefaultClient();
        this._HttpClient.DefaultRequestHeaders.Authorization =
            new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", base64EncodedSecret);
    }

    [Fact]
    public async Task Test1()
    {
        var response = await _HttpClient.GetAsync("/testfolder/document.txt");
        Assert.Equal(HttpStatusCode.OK, response.StatusCode);
    }
}
Run Code Online (Sandbox Code Playgroud)

测试失败并显示 401 Unauthorized(context.User.Identity.IsAuthenticated在我的 AuthenticationValidator 中间件的 InvokeAsync 方法中为 false)。为什么?
如果我使用 Postman 发送相同的 Get-Request,也使用基本身份验证,那么它就可以工作(即为context.User.Identity.IsAuthenticatedtrue)。
我已经检查了base64EncodedSecret几次,它在我的测试和邮递员请求中匹配。

我知道在集成测试中,服务器不是“正常”启动,而是“在测试框架内”运行。在此环境中身份验证的工作方式是否有所不同?我“谷歌搜索”的所有内容都只是关于具有端点、控制器和 [Authorize] 属性的 API。我这里什么都没有。

我也不想“假冒”用户进行测试(至少现在还不想)。
我想使用系统中存在的“普通”用户运行集成测试。