在 ASP.Net 核心集成测试中模拟 IIS 应用程序池标识
Simulating IIS App Pool Identity in ASP.Net Core Integration Test
我正在尝试为我正在编写的 ASP.Net Core 3.1 API 编写集成测试。我正在使用 WebApplicationFactory<> class 来创建一个 HttpClient 来调用 API.
_Factory = new WebApplicationFactory<Startup>()
.WithWebHostBuilder(b =>
{
b.ConfigureTestServices(services =>
{
services.AddAuthentication("Test")
.AddScheme<AuthenticationSchemeOptions, MyAuthHandler>("Test", options => { });
RegisterTestServices(services);
});
});
与:
public class MyAuthHandler: AuthenticationHandler<AuthenticationSchemeOptions>
{
public MyAuthHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock) { }
protected override Task<AuthenticateResult> HandleAuthenticateAsync()
{
var claims = new[] {new Claim("preferred_username", "mchu")};
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);
}
}
这成功地让我检索了一个可以调用我的端点(用 [Authorize] 装饰)的 HttpClient,所以我没有收到 401 错误。但是,由于尝试访问网络共享时出现权限问题,我的一些测试失败了。
在实际的 IIS 部署中,我们的应用程序池将使用对这些共享具有 read/write 访问权限的身份。
我能做些什么来确保我的 API 代码以可以访问那些受保护资源的权限运行?我们现有的集成测试代码(对于非 ASP.Net 核心代码——这是一个转换)通过简单地在管理员模拟上下文中执行特定操作来解决这个问题。对于这些新测试,我也很好。
然而,在还没有完全了解 WebApplicationFactory<>(或者 ASP.Net 核心中间件管道的任何部分,真的)的情况下,我不确定我将如何去做这件事。
ASP.NET 核心不实现模拟。应用程序 运行 具有所有请求的应用程序标识,使用应用程序池或进程标识。如果应用程序应代表用户执行操作,请在 Startup.Configure 中的终端内联中间件中使用 WindowsIdentity.RunImpersonated。 运行 在此上下文中执行单个操作,然后关闭上下文。
更多细节可以参考这个document
我正在尝试为我正在编写的 ASP.Net Core 3.1 API 编写集成测试。我正在使用 WebApplicationFactory<> class 来创建一个 HttpClient 来调用 API.
_Factory = new WebApplicationFactory<Startup>()
.WithWebHostBuilder(b =>
{
b.ConfigureTestServices(services =>
{
services.AddAuthentication("Test")
.AddScheme<AuthenticationSchemeOptions, MyAuthHandler>("Test", options => { });
RegisterTestServices(services);
});
});
与:
public class MyAuthHandler: AuthenticationHandler<AuthenticationSchemeOptions>
{
public MyAuthHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock) { }
protected override Task<AuthenticateResult> HandleAuthenticateAsync()
{
var claims = new[] {new Claim("preferred_username", "mchu")};
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);
}
}
这成功地让我检索了一个可以调用我的端点(用 [Authorize] 装饰)的 HttpClient,所以我没有收到 401 错误。但是,由于尝试访问网络共享时出现权限问题,我的一些测试失败了。
在实际的 IIS 部署中,我们的应用程序池将使用对这些共享具有 read/write 访问权限的身份。
我能做些什么来确保我的 API 代码以可以访问那些受保护资源的权限运行?我们现有的集成测试代码(对于非 ASP.Net 核心代码——这是一个转换)通过简单地在管理员模拟上下文中执行特定操作来解决这个问题。对于这些新测试,我也很好。
然而,在还没有完全了解 WebApplicationFactory<>(或者 ASP.Net 核心中间件管道的任何部分,真的)的情况下,我不确定我将如何去做这件事。
ASP.NET 核心不实现模拟。应用程序 运行 具有所有请求的应用程序标识,使用应用程序池或进程标识。如果应用程序应代表用户执行操作,请在 Startup.Configure 中的终端内联中间件中使用 WindowsIdentity.RunImpersonated。 运行 在此上下文中执行单个操作,然后关闭上下文。
更多细节可以参考这个document