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。我这里什么都没有。
我也不想“假冒”用户进行测试(至少现在还不想)。
我想使用系统中存在的“普通”用户运行集成测试。