Kestrel HTTPS POST在生产中会导致400个错误的请求状态代码(ASP.NET Core 2.x)

时间:2017-12-07 18:33:51

标签: asp.net asp.net-core kestrel-http-server

我遵循了这篇文章https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl

我完全按照文章建议设置的地方

// Requires using Microsoft.AspNetCore.Mvc;
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<MvcOptions>(options =>
    {
        options.Filters.Add(new RequireHttpsAttribute());
    });

// Requires using Microsoft.AspNetCore.Rewrite;
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    var options = new RewriteOptions()
       .AddRedirectToHttps();

    app.UseRewriter(options);

在所有浏览器上发送GET请求时,这似乎工作正常。但是,当它遇到POST请求时,我得到一个400状态代码而没有太多指示导致它的原因 - 奇怪的是,在DEBUG模式下不会发生这个问题。

如果我使用Edge或IE,则不会发生此错误。当我使用Chrome或POSTMAN时,我会收到400状态代码。

奇怪的是,如果我使用POSTMAN,并且我将POST请求更改为使用HTTP而不是HTTPS,我会得到200(OK)响应。所以,我认为上面的文章存在某种问题,但我对解决方案没有太大帮助。

任何人对此问题有任何经验或见解吗?

1 个答案:

答案 0 :(得分:3)

我从未使用过ASP.NET Core重写器,但在查看其代码时,它使用标准的class ImageGalleryBlock(blocks.StructBlock): images = ListBlock(ImageChooserBlock(label='Image')) def js_initializer(self): parent_initializer = super(ImageGalleryBlock, self).js_initializer() return "ImageGallery(%s)" % parent_initializer @property def media(self): # need to pull in StructBlock's own js code as well as our own return super(ImageGalleryBlock, self).media + forms.Media( js=['app/js/admin/image-gallery.js'] ) 方法 - https://github.com/aspnet/BasicMiddleware/blob/9814f3bfbcf3a11dc86c4047fbfc2fe48744f96c/src/Microsoft.AspNetCore.Rewrite/Internal/RedirectToHttpsRule.cs#L33

此Redirect()方法只能返回HTTP 301或302代码。 浏览器很可能会遵循此重定向,但它可能决定使用GET或POST而不使用任何数据。 我建议在浏览器开发工具中启用Response.Redirect()并检查实际发生的情况。这篇文章很好地描述了它 - https://scotthelme.co.uk/report-uri-journey-to-a-permanent-redirect/

长话短说,您需要HTTP 307或308. preserve log有一个可选的状态代码参数,在代码中的任何地方都不使用(看起来像ASP.NET Core上的错误)

您可能必须编写自己的代码来重定向HTTP请求。

我在一个项目中遇到了同样的问题,为了简单起见,我决定为非GET HTTP请求返回HTTP 403 Forbidden

修改

我查看了AddRedirectToHttps的错误分支。实际上它似乎能够返回不同的状态代码,然后只返回301和302,因此您应该能够轻松地将状态代码配置为参数。