【问题标题】:Simulating IIS App Pool Identity in ASP.Net Core Integration Test在 ASP.Net Core 集成测试中模拟 IIS 应用程序池标识
【发布时间】:2020-10-28 23:29:16
【问题描述】:

我正在尝试为我正在编写的 ASP.Net Core 3.1 API 编写集成测试。我正在使用 WebApplicationFactory 类来创建一个用于调用 API 的 HttpClient。

_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);
    }
}

这成功地允许我检索一个可以调用我的端点的 HttpClient(用 [Authorize] 装饰),所以我不会收到 401 错误。但是,由于尝试访问网络共享时的权限问题,我的一些测试失败了。

在实际的 IIS 部署中,我们的应用程序池将使用对这些共享具有读/写访问权限的身份。

我可以做些什么来确保我的 API 代码以可以访问这些受保护资源的权限运行?我们现有的集成测试代码(对于非 ASP.Net Core 代码——这是一种转换)通过在管理员模拟上下文中简单地执行特定操作来解决这个问题。对于这些新测试,我也可以这样做。

但是,我还没有完全了解 WebApplicationFactory(或任何一点 ASP.Net Core 中间件管道,真的),我不知道该怎么做。

【问题讨论】:

    标签: c# asp.net-core integration-testing asp.net-core-webapi


    【解决方案1】:

    ASP.NET Core 不实现模拟。使用应用程序池或进程标识,应用程序使用应用程序标识运行所有请求。如果应用应代表用户执行操作,请在 Startup.Configure 的终端内联中间件中使用 WindowsIdentity.RunImpersonated。在此上下文中运行单个操作,然后关闭上下文。

    更多详情可以参考这个document

    【讨论】:

    • 谢谢。我确实在尝试中找到了这篇文章,所以解决了这个问题,我的解决方案和你描述的差不多。唯一的区别是我只在使用自定义“测试”开发环境时配置中间件,因为在生产中,正确的行为是由 IIS 的托管提供的。然而,我很好奇,什么“正常”用例是这样的,大多数 ASP.Net Core 集成测试代码的过程不需要应用程序池用户的权限,这可能与运行用户的权限不同测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 2010-11-27
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 2011-01-07
    相关资源
    最近更新 更多