网站安全性越做越高,不免都要使用 HTTPS 加密连线,但本机用 localhost
都是 HTTP,想测试 HTTPS 需要额外的设定。
本篇将介绍 ASP.NET Core 强制使用 SSL 加密连线。
启用 SSL
可以再 Web 专案点滑鼠右键,用图形化的工具启用 SSL Port,如下:
或直接编辑 Properties\launchSettings.json
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:33333/",
"sslPort": 44333
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true
}
}
}
设定 SSL Port 后,就可以在 localhost
使用 HTTPS
了。但会遇到隐私权问题,因为我们没有真的汇入凭证,可以先把他忽略。步骤如下:
强制 SSL
只有单纯启动 SSL Port 的话,依然可以使用 HTTP,只要自己更改网址列就可以。强制走 HTTPS 的话还要经过以下设定。
先安装两个套件:
- Microsoft.AspNetCore.Mvc
- Microsoft.AspNetCore.Rewrite
要强制使用 HTTPS 的页面可以在 Action 或 Controller 注册 RequireHttpsAttribute
或注册于全域范围,只要不是 HTTPS 就会回传 HTTP Status Code 302 并转址到 HTTPS,如下:
- 区域注册
Controllers\UserController.cs
using Microsoft.AspNetCore.Mvc;
// ...
namespace MyWebsite.Controllers
{
// 区域注册
[RequireHttps]
public class UserController : Controller
{
// ...
}
}
- 全域注册
Startup.cs
using Microsoft.AspNetCore.Mvc;
// ...
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// 全域注册
services.Configure<MvcOptions>(options =>
{
options.Filters.Add(new RequireHttpsAttribute());
});
}
}
RequireHttpsAttribute
转址预设是转到 443 Port,如果 HTTPS 不是用 443 Prot,就要在注册 MVC 服务的时候,修改 SslPort
,如下:
Startup.cs
// ...
public class Startup
{
private readonly int _httpsPort;
public Startup(IHostingEnvironment env)
{
if (env.IsDevelopment())
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile(@"Properties/launchSettings.json");
var launchConfig = builder.Build();
_httpsPort = launchConfig.GetValue<int>("iisSettings:iisExpress:sslPort");
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options => options.SslPort = _httpsPort);
// ...
}
}
用 RequireHttpsAttribute
的方式,只能限制到 MVC / API 的部分,并没有办法连静态档案都强制使用 HTTPS。
如果整个网站都要用 HTTPS 的话,可以加入 URL Rewrite,将非 HTTPS 都转址到 HTTPS。
在 Startup.Configure
呼叫 UseRewriter
加入转址的 Pipeline,如下:
Startup.cs
// ...
public class Startup
{
// ...
public void Configure(IApplicationBuilder app, )
{
app.UseRewriter(new RewriteOptions().AddRedirectToHttps(301, _httpsPort));
// ...
}
}
完成以上设定后,不管是用 HTTP 还是 HTTPS 最终都会转到 HTTPS 用 SSL 连线了。
为了网站有更高的安全性,就全部都用 SSL 吧!