WebApplicationFactory不工作的模拟身份验证



我们在。net 6 WebAPI集成测试中遇到了一些模拟身份验证的问题。

所采用的方法正是微软的集成测试指南中所描述的方法:

factory = new WebApplicationFactory<Startup>();
var client = factory.WithWebHostBuilder(builder =>
{
builder
.UseTestServer()
.ConfigureTestServices(services =>
{
services.AddAuthentication("Test")
.AddScheme<AuthenticationSchemeOptions, TestAuthHandler>(
"Test", options => {});
});
})
.CreateClient(new WebApplicationFactoryClientOptions
{
AllowAutoRedirect = false,
});
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Test");
var result = await client.GetAsync($"{client.BaseAddress}/api/mycontroller/{par1}/{par2}");

请注意,模拟的身份验证模式"Test"在客户端授权头中设置为默认值。

身份验证处理程序是这样定义的:

public class TestAuthHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
public TestAuthHandler(IOptionsMonitor<AuthenticationSchemeOptions> options,
ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock)
: base(options, logger, encoder, clock)
{
}
protected override Task<AuthenticateResult> HandleAuthenticateAsync()
{
var claims = new[] { new Claim(ClaimTypes.Name, "Test user") };
var identity = new ClaimsIdentity(claims, "Test");
var principal = new ClaimsPrincipal(identity);
var ticket = new AuthenticationTicket(principal, "Test");
var result = AuthenticateResult.Success(ticket);
return Task.FromResult(result);
}
}

API方法具有[Authorize]属性,并且可以很好地与生产客户端代码(默认承载令牌设置)进行身份验证请求。

在测试执行时,GetAsync调用的结果是302。对于未经身份验证的调用,这是预期的,因为在测试设置期间禁用了重定向。

问题是为什么不调用模拟身份验证处理程序(HandleAuthenticateAsync方法)?

如果我明确授权"Test"模式,然后正确调用身份验证。

//[Authorize]
[Authorize(AuthenticationSchemes = "Test")]

我也尝试暂时从启动类中删除身份验证,但没有看到任何效果。

有人能帮助理解为什么嘲笑不起作用吗?

我还可以检查或尝试什么,以便我可以正确地模拟身份验证?

在寻找解决方案时,我遇到了这个相关的问题。

尽管不完全是我的用例,但我得到了关于缺少授权的提示。所以我做了web应用程序工厂创建:

var client = factory.WithWebHostBuilder(builder =>
{
builder
.UseTestServer()
.ConfigureTestServices(services =>
{
services.AddAuthentication("Test")
.AddScheme<AuthenticationSchemeOptions, TestAuthHandler>(
"Test", options => { });
services.AddAuthorization(opts =>
{
opts.DefaultPolicy = new AuthorizationPolicyBuilder()
.AddAuthenticationSchemes("Test")
.RequireAuthenticatedUser()
.Build();
});
});
})
.CreateClient(new WebApplicationFactoryClientOptions
{
AllowAutoRedirect = false,
});

这似乎足够了。至少我的样例测试用例现在通过了,我可以通过TestAuthHandler进行调试。示例库现已更新。

最新更新