2017-01-09 55 views
1

继这篇不错的文章https://long2know.com/2016/07/asp-net-core-enforcing-https/之后,我尝试强制使用HTTPS,但除了一个单一的web-api控制器必须响应嵌入式系统的SSL。该问题存在于startup.cs的以下Configure部分。如何排除在ASP.NET Core 1.1中重定向到https的控制器

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

     app.UseRewriter(options); 

随着AddRewrite线(不更换任何东西),我尝试触发skipRemainingRules以避免重定向。这是在IIS express(槽本地主机)的开发工作,但不是在IIS后面的生产环境中。显然,SkipRemainingRules不会阻止AddRedirectToHttps生效。

非常感谢任何线索可能会解决这个问题。

回答

0

我认为有一个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除了那些内部api关键字执行https

+0

谢谢亚瑟。我已经直接在IIS服务器及其工作上做了这些工作(只要它在部署过程中不会被替换!)。所以我试图将它移动到项目中,并在开发期间跟踪IIS Express。但正如文件中所述,'web.config'被'appsettings.json'取代,我找不到适合生产和开发环境的体面出路。在'startup.cs'中也没有 – Andre

0

我最终用自定义重定向修复:

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的配置部分注册:

app.UseRewriter(新RewriteOptions()加入(新CustomRedirect() ));