【问题标题】:How to exclude a controller of being redirect to https in ASP.NET Core 1.1如何在 ASP.NET Core 1.1 中排除重定向到 https 的控制器
【发布时间】:2017-05-24 05:59:17
【问题描述】:

在这篇精彩的文章https://long2know.com/2016/07/asp-net-core-enforcing-https/ 之后,我尝试强制执行 HTTPS,但一个 web-api 控制器除外,它必须响应不支持 SSL 的嵌入式系统。问题存在于 startup.cs 的以下配置部分。

        var options = new RewriteOptions()
           .AddRewrite("^api/&", "/api/", skipRemainingRules: true) 
           .AddRedirectToHttps(302, sslPort);

        app.UseRewriter(options);

使用 AddRewrite 行(不替换任何内容)我尝试触发 skipRemainingRules 以避免重定向。这适用于 IIS express(通过 localhost)的开发,但不适用于 IIS 背后的生产环境。显然 SkipRemainingRules 并不会阻止 AddRedirectToHttps 生效。

非常感谢您提供任何可以解决此问题的线索。

【问题讨论】:

    标签: redirect url-rewriting asp.net-core-1.1


    【解决方案1】:

    我知道我的回复很晚,但也许它会对某人有所帮助。

    var options = new RewriteOptions()
                .AddRewrite(@"^api/(.*)", "api/$1", true)
                .AddRedirectToHttps(302, sslPort);
    app.UseRewriter(options);
    

    使用此解决方案,您可以在 http 上调用 /api/...,其他所有请求都将被重定向到 https。

    我已经用 .Net Core 2.1 测试了这个解决方案。

    【讨论】:

      【解决方案2】:

      我最终通过自定义重定向修复它:

      public class CustomRedirect : Microsoft.AspNetCore.Rewrite.IRule
      {
           public void ApplyRule(RewriteContext context)
          {
              var request = context.HttpContext.Request;
              var host = request.Host;
      
              // Exclude localhost
              if ( string.Equals(host.Host, "localhost", StringComparison.OrdinalIgnoreCase))
              {
                  context.Result = RuleResult.ContinueRules;
                  return;
              }
      
              // Exclude api
              if (request.Path.Value.Contains("/api/"))
              {
                  context.Result = RuleResult.ContinueRules;
                  return;
              }
      
              // force other traffic to https
              if (string.Equals(request.Scheme, "http", StringComparison.OrdinalIgnoreCase))
              {
                  string path = "https://" + host.Value + request.PathBase + request.Path + request.QueryString;
                  context.HttpContext.Response.Redirect(path,true);
                  context.Result = RuleResult.EndResponse;
              }     
          }
      }
      

      并在 startup.cs 的 Configure 部分注册:

      app.UseRewriter(new RewriteOptions().Add(new CustomRedirect()));

      【讨论】:

        【解决方案3】:

        我认为有一个 issue 与 IIS 一起工作,即使在 Azure Web 应用程序中关于 http/https 重定向。

        因此,实现这一目标的一种方法是通过web.config 执行它,如下所示:

        <system.webServer>
            <rewrite>
              <rules>
                <rule name="HTTP/S to HTTPS Redirect" enabled="true" stopProcessing="true">
                    <match url="^((?!api).)*$" />
                    <conditions logicalGrouping="MatchAny">
                      <add input="{SERVER_PORT_SECURE}" pattern="^0$" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}/{R:0}" redirectType="Permanent" />
                </rule>
              </rules>
            </rewrite>
          </system.webServer>
        

        按照这个约定,您对每个 url 强制执行 https,除了那些内部带有 api 关键字的那些。

        【讨论】:

        • 谢谢亚瑟。我已经直接在 IIS 服务器和它的工作上做了这个(只要它在部署期间没有被替换!)。所以我试图把它移到项目中,也为了在开发过程中跟踪 IIS Express。但正如文件本身所述,“web.config”被“appsettings.json”取代,我找不到适合生产和开发环境的体面出路。不在“startup.cs”中
        猜你喜欢
        • 2021-03-30
        • 2013-03-20
        • 2020-04-21
        • 1970-01-01
        • 2017-09-05
        • 2017-11-19
        • 2021-12-20
        • 2021-07-29
        • 1970-01-01
        相关资源
        最近更新 更多