2017-01-22 59 views
0

我嘗試了很多不同的東西,我只是厭倦了把我的頭撞在桌子上。ASP.Net核心:在哪裏放app.Use()來強制HTTPS

我正在創建一個ASP.NET Core MVC網站。該網站工作正常,直到我開始嘗試在SSL中測試功能。我試過以下鏈接:

第三項保持重現上其他一些鏈接,所以我嘗試多種方式來獲取工作。我已將代碼設置移動到Startup類'Configure方法的多個位置。如果我在app.UseMvc()調用之前的任何位置放置代碼段,我什麼都不會收到:主頁(不在SSL下)不會出現,所以我無法關注任何鏈接。當我將它放在app.UseMvc()呼叫之後時,任何使用[RequireHttps]屬性的方法都會轉到「不存在」鏈接。這是有道理的,因爲我想使用MVC。但是,我如何測試HTTPS?

app.Use(async (context,next)...的代碼去哪裏?

我目前Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
    loggerFactory.AddDebug(); 
      var sslPort = Configuration.GetValue<int>("iisSetting:iisExpress:sslPort"); 

    if (env.IsDevelopment()) 
    { 
     app.UseDeveloperExceptionPage(); 
     app.UseBrowserLink(); 
    } 
    else 
    { 
     app.UseExceptionHandler("/Home/Error"); 
    } 

    app.UseStaticFiles(); 

    app.UseMvc(routes => 
    { 
     routes.MapRoute(
      name: "default", 
      template: "{controller=Home}/{action=Index}/{id?}"); 
    }); 

    app.Use(async (context, next) => 
    { 
     if (context.Request.IsHttps) 
      await next(); 
     else 
     { 
      var sslPortStr = ((sslPort == 0) || (sslPort == 443)) ? string.Empty : ($":{sslPort}"); 
      var sslUrl = $"https://{context.Request.Host.Host}{sslPort}{context.Request.Path}"; 
      context.Response.Redirect(sslUrl); 
     } 
    }); // */ 
} 

UPDATE:(2017年1月26日) 我發現,如果我手動輸入SSL端口號,在瀏覽器的網址時,系統進入SSL/HTTPS ......但是,即使在不需要安全性的頁面上,它也會停留在那裏。

我想要做的是在URL中顯示正確的端口號,而不需要手動輸入它們......並僅用於測試目的。

回答

0

你做它在配置服務:如果

services.Configure<MvcOptions>(options => 
{ 
    options.Filters.Add(new RequireHttpsAttribute()); 
}); 

但是,將失敗(404)沒有SSL證書。 running directly from kestrel將與IIS Express不同。使用VS 2015,您可以選中項目屬性中的框來使用ssl,它將自動爲IIS Express生成一個自簽名證書

+0

如上所述,試着在主頁上給出HTTP 404。我沒有選中該項目的屬性框,這是我擁有HTTPS端口的地方。如果我能避免它,我也寧願不使用Kestrel比項目中已經有的更多。我實際上確實遵循了你在發佈之前提供的鏈接,但是我沒有得到Wildermuth暗示的結果。 –

+0

只要你在IISExpress中運行它,自簽名證書應該可以工作。您需要更改啓動網址以匹配您在勾選該框時生成的ssl網址。一旦你應用了過濾器,非SSL鏈接將會給404,所以如果你仍然使用它作爲可能是問題的啓動URL –

0

您可以在app.UseStaticFiles();之前執行您正在執行的操作。然後,任何對文件或MVC路由的調用都將被重定向到安全版本。

app.Use(async (context, next) => 
{ 
    if (context.Request.IsHttps) 
     await next(); 
    else 
    { 
     var sslPortStr = ((sslPort == 0) || (sslPort == 443)) ? string.Empty : ($":{sslPort}"); 
     var sslUrl = $"https://{context.Request.Host.Host}{sslPort}{context.Request.Path}"; 
     context.Response.Redirect(sslUrl); 
    } 
}); 
app.UseStaticFiles(); 

app.UseMvc(routes => 
{ 
    routes.MapRoute(
     name: "default", 
     template: "{controller=Home}/{action=Index}/{id?}"); 
}); 

我剛剛寫了一篇關於此的小文章:https://joonasw.net/view/enforcing-https-in-aspnet-core

+0

當我這樣做時,我得到HTTP 404。 –

+0

對不起。出於某種原因,我無法編輯以前的帖子。當我移動應用程序時,我在主頁上獲得了HTTP 404.在app.UseMvc調用之前的任何地方使用了調用。我確實找到了你的鏈接或類似的鏈接,談到創建中間件。我的問題是,我現在只是在嘗試測試。根據所有帳戶,如果我發佈該網站,HTTPS將提供有效的證書。有沒有添加HTTPS專門用於測試目的的方法? –

0

您可以在添加mvc時對其進行配置。

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc(options => 
    { 
     options.SslPort = 433; // your ssl port no 
     options.Filters.Add(new RequireHttpsAttribute()); 
    }); 
} 
+0

這也給主頁上的HTTP 404。 –