Pełną odpowiedź jest numerem 1, ale nie kończą konfigurowania protokołu HTTPS, należy przejść dodatkowy krok:
1 - Następnie używamy RequireHttpsAttribute
przekierowanie do HTTPS i ustawić port SSL w opcjach MVC . Odczytujemy także port SSL z launchSettings.json, ale potrzebujemy go tylko w trybie programowania.
2 - Użyj AddAntiforgery
, aby wymagać protokołu HTTPS na tokenach zapobiegających fałszerstwu.
3 - Użyj pakietu NuGet NWebsec.AspNetCore.Middleware
i UseHsts
, aby włączyć Strict Transport Security (HSTS) w całym serwisie. Nie zapomnij dodać obciążenia wstępnego poniżej i prześlij swoją witrynę pod numer HSTS Preload site. Więcej informacji: here i here.
4 - Użyj pakietu NWebsec.AspNetCore.Middleware
NuGet i metody UseHpkp
, aby włączyć publiczne przypinanie klawiszy (HPKP) w całym serwisie. Zauważ, że jeśli popełnisz błąd w tym, to w zasadzie Zrobisz swoją stronę.Więcej informacji: here i here.
5 - Uwzględnij schemat https w dowolnym użytym adresie URL. Content Security Policy (CSP) Nagłówek HTTP i Subresource Integrity (SRI) nie grają dobrze, gdy naśladujesz schemat w niektórych przeglądarkach. Lepiej mówić otwarcie o HTTPS. na przykład
<script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.4/bootstrap.min.js"></script>
6- Użyj ASP.NET MVC Boilerplate programu Visual Studio projektu szablonu, aby wygenerować projekt z tego wszystkiego i znacznie więcej zbudowany w. Można również wyświetlić kod na GitHub.
Po wszystkich wyżej wymienionych, klasa Startup
powinien wyglądać mniej więcej tak:
public class Startup
{
private readonly int? sslPort;
public Startup(IHostingEnvironment hostingEnvironment)
{
if (hostingEnvironment.IsDevelopment())
{
var launchConfiguration = new ConfigurationBuilder()
.SetBasePath(hostingEnvironment.ContentRootPath)
.AddJsonFile(@"Properties\launchSettings.json")
.Build();
// During development we won't be using port 443.
this.sslPort = launchConfiguration.GetValue<int>("iisSettings:iisExpress:sslPort");
}
}
public void ConfigureServices(IServiceCollection services)
{
services
.AddAntiforgery(options =>
{
options.RequireSsl = true;
});
.AddMvc(options =>
{
options.Filters.Add(new RequireHttpsAttribute());
options.SslPort = sslPort;
});
}
public void Configure(IApplicationBuilder application)
{
application
.UseHsts(options => options.MaxAge(days: 18 * 7).IncludeSubdomains().Preload())
.UseHpkp(options => options
.Sha256Pins(
"Base64 encoded SHA-256 hash of your first certificate e.g. cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs=",
"Base64 encoded SHA-256 hash of your second backup certificate e.g. M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE=")
.MaxAge(days: 18 * 7)
.IncludeSubdomains())
.UseCsp(options => options
.UpgradeInsecureRequests(this.sslPort.HasValue ? this.sslPort.Value : 443))
.UseMvc();
}
}
Masz rację, to nie działa z rdzeniem. Ale zmiana na to działało: var withHttps = "https: //" + context.Request.Host + context.Request.Path; – William
Ponieważ jest to tak proste, wygląda na to, że powinna istnieć prosta .RequireHttps() w wbudowanej bibliotece. – William
Czy istnieje sposób sprawdzenia, jaki jest port HTTPS? Zazwyczaj będzie to oczywiście 443, ale w środowisku programistycznym, gdzie, powiedzmy, korzystasz z IIS Express, Visual Studio zwykle ustawia port SSL na coś takiego jak 44300. W takim przypadku, czy ten fragment kodu nie przekieruje do niewłaściwego adresu URL? Znaczenie: 'http: // localhost: 5900' stanie się' https: // localhost: 5900', gdy powinno być 'https: // localhost: 44300'. Jakikolwiek sposób, aby uniknąć twardego kodowania numeru portu? –