如何在ASP.NET Core 2.1中的静态文件上强制https重定向?

时间:2018-06-29 16:14:04

标签: asp.net-core asp.net-core-2.1

我有一个启用HTTPS重定向的ASP.NET Core应用程序。问题是HTTPS重定向不适用于静态文件,因此当我使用http进入站点时,前端与后端的端口不同,这会导致CORS阻止对后端的所有请求。我尝试允许CORS处理所有请求(当然是用于测试),但是无论我做什么,这些请求都失败了。仅使用https访问前端有效。如何使用ASP.NET Core强制对静态文件进行https重定向?

2 个答案:

答案 0 :(得分:2)

根据我的经验,您必须将此代码添加到startup.cs文件中

   public void ConfigureServices(IServiceCollection services)
        {

            services.AddHttpsRedirection(options =>
            {
                options.HttpsPort = 443;
            });

您必须爱上Microsoft documentation。不完整示例下面的6个段落告诉您有关此要求的信息:

  

如果未设置端口:

     
      
  • 请求未重定向。
  •   

您可以使用以下技术来设置端口:

可以通过设置端口来配置端口:

  • ASPNETCORE_HTTPS_PORT环境变量。
  • http_port主机配置密钥(例如,通过hostsettings.json或命令
  • line参数)。
    • HttpsRedirectionOptions.HttpsPort。请参阅前面的

答案 1 :(得分:1)

这对我有用。

app.UseStaticFiles(new StaticFileOptions()
{
    OnPrepareResponse = (context) =>
    {
        var request = context.Context.Request;
        var response = context.Context.Response;
        UrlRewriteUtils.RedirectIfHttp(request, response);
    }
});

这是Utility方法。

public class UrlRewriteUtils 
{
       public static void RedirectIfHttp(HttpRequest request, HttpResponse response)
       {
            string reqProtocol;
            if (request.Headers.ContainsKey("X-Forwarded-Proto"))
                reqProtocol = request.Headers["X-Forwarded-Proto"][0];
            else if (request.IsLocal())
                reqProtocol = "https";
            else
                reqProtocol = request.IsHttps ? "https" : "http";

            if (reqProtocol.ToLower() != "https")
            {
                var newUrl = new StringBuilder()
                    .Append("https://").Append(request.Host)
                    .Append(request.PathBase).Append(request.Path)
                    .Append(request.QueryString);
                response.Redirect(newUrl.ToString(), true);
            }
        }
    }