协商身份验证和 Microsoft.AspNetCore.Mvc.Testing

ste*_*and 8 c# asp.net-mvc integration-testing asp.net-core

learn.microsoft.com推荐使用Microsoft.AspNetCore.Mvc.Testing进行集成测试,这似乎是一个不错的选择,但他们似乎错过了添加使用NegotiateDefaults.AuthenticationScheme进行测试的功能。

添加到 Startup.cs/ConfigureServices

 services.AddAuthentication (NegotiateDefaults.AuthenticationScheme).AddNegotiate ();
Run Code Online (Sandbox Code Playgroud)

导致测试失败

消息:System.NotSupportedException:协商身份验证需要支持 IConnectionItemsFeature(如 Kestrel)的服务器。

有谁知道如何将Microsoft.AspNetCore.Mvc.Testing与使用 NegotiateDefaults.AuthenticationScheme 的端点一起使用?是否只是像例外声明一样不受支持?

ste*_*and 0

这是设计不支持的

WebApplicationFactory不使用kestrel,它使用内存中的TestServer和内存中的HttpClient。这些都不支持协商身份验证所需的功能。

我放弃了 Microsoft.AspNetCore.Mvc.Testing 并使用自定义 NUnit 基类:

public class AspNetCoreIntegrationTestBase
{
  public CancellationTokenSource? CancellationTokenSource { get; set; }

  public Task? TestWebserver { get; set; }

  [OneTimeSetUp]
  public void Setup()
  {
    CancellationTokenSource = new CancellationTokenSource();
    TestWebserver = Program.CreateHostBuilder(Array.Empty<string>()).Build().StartAsync(CancellationTokenSource.Token);
  }

  [OneTimeTearDown]
  public void CleanUp()
  {
    CancellationTokenSource?.Cancel();
    TestWebserver?.Dispose();
  }
}
Run Code Online (Sandbox Code Playgroud)

要使用的 httpclient 需要初始化

UseDefaultCredentials = true
Run Code Online (Sandbox Code Playgroud)