如何在 ASP.NET Core 中测试 https 重定向?

Posted

技术标签:

【中文标题】如何在 ASP.NET Core 中测试 https 重定向?【英文标题】:How do I test an https redirect in ASP.NET Core? 【发布时间】:2018-09-21 19:02:10 【问题描述】:

最近,我想出了用于检查我的 ASP.NET Core 2.1 应用程序的一些重定向规则的单元测试:

[Fact(DisplayName = "lowercase path")]
public async Task LowercaseRedirect()

    var result = await this.Client.GetAsync("/BLOG/");
    Assert.EndsWith("/blog/", result.RequestMessage.RequestUri.PathAndQuery, StringComparison.InvariantCulture);


[Fact(DisplayName = "add missing slash")]
public async Task SlashRedirect()

    var result = await this.Client.GetAsync("/blog");
    Assert.EndsWith("/blog/", result.RequestMessage.RequestUri.PathAndQuery, StringComparison.InvariantCulture);

仅供参考:我目前正在将WebApplicationFactory<TEntryPoint> 注入我的测试类,我用它来创建我的HttpClient

但现在我很好奇如何检查 https 重定向是否有效。任何想法如何做到这一点?在此先感谢:)

【问题讨论】:

您应该禁用httpclient的自动重定向功能,然后在响应头中测试Location值 【参考方案1】:

对于UseHttpsRedirection,必须有一个端口可供中间件重定向到 HTTPS。如果没有可用的端口,则不会重定向到 HTTPS。

HTTPS 端口可以通过以下任意设置来指定:

HttpsRedirectionOptions.HttpsPort ASPNETCORE_HTTPS_PORT 环境变量。 在开发中,launchsettings.json 中的 HTTPS 网址。 直接在 Kestrel 或 HttpSys 上配置的 HTTPS URL。

参考:UseHttpsRedirection

要测试 UseHttpsRedirection,请指定 https 端口。您可以按照以下步骤操作:

    https_port 配置WebApplicationFactory

    public class UnitTest1 : IClassFixture<WebApplicationFactory<CoreHttps.Startup>>
    
        private readonly WebApplicationFactory<CoreHttps.Startup> _factory;
    
    public UnitTest1(WebApplicationFactory<CoreHttps.Startup> factory)
    
        _factory = factory.WithWebHostBuilder(builder => builder
            .UseStartup<Startup>()
            .UseSetting("https_port", "8080")); 
    
    

    默认情况下,请求 url 是http://localhost/,如果客户端没有自动重定向,请检查请求 url。

    [Theory]
    [InlineData("/Home")]
    public async Task HttpsRedirectionWithoutAutoRedirect(string url)
    
        // Arrange
        var client = _factory.CreateClient(new WebApplicationFactoryClientOptions
                                
                                    AllowAutoRedirect = false
                                );
        // Act
        var response = await client.GetAsync(url);
        // Assert
        Assert.Equal(HttpStatusCode.RedirectKeepVerb, response.StatusCode);
        Assert.StartsWith("http://localhost/",
            response.RequestMessage.RequestUri.AbsoluteUri);
    
        Assert.StartsWith("https://localhost:8080/",
            response.Headers.Location.OriginalString);
    
    

    如果请求是自动重定向,请检查请求 url。

    [Theory]
    [InlineData("/Home")]
    public async Task HttpsRedirectionWithAutoRedirect(string url)
    
        // Arrange
        var client = _factory.CreateClient();
        // Act
        var response = await client.GetAsync(url);
    
        // Assert
        Assert.Equal(HttpStatusCode.OK, response.StatusCode);
        Assert.StartsWith("https://localhost:8080/",
            response.RequestMessage.RequestUri.AbsoluteUri);
    
    

【讨论】:

我想问一个问题,关于如何使用 HTTPS 进行集成测试内存服务器;你的第 1 步解决了我的问题。谢谢!

以上是关于如何在 ASP.NET Core 中测试 https 重定向?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET Core 中使用 ILogger 进行单元测试

使用Http-Repl工具测试ASP.NET Core 2.2中的Web Api项目

如何对 ASP.NET Core 控制器或模型对象进行单元测试?

如何在 ASP.NET Core 控制器中返回自定义 HTTP 响应?

ASP.NET Core中如何针对一个使用HttpClient对象的类编写单元测试

ASP.NET Core中的缓存[1]:如何在一个ASP.NET Core应用中使用缓存