2017-01-09 52 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() ));