.NET Core Web 应用程序可以使用不同的 Web 服务器:
- IIS Express(在 Visual Studio 中按 F5 时)
支持 NTLM、协商 (Kerberos)
仅限 Windows
- IIS(部署到 IIS 文件夹时)
支持 NTLM,协商
仅限 Windows
- Kestrel(使用“dotnet run”或从命令行执行时)
支持协商(使用 nuget 包,请参阅 Yush0s 回复)
视窗/Linux
- http.sys(与 kestrel 类似,但在 Startup.cs 中配置)
支持 NTLM,协商
仅限 Windows
IIS / IIS Express 中的 Windows 身份验证可以正常工作。
Kestrel 只能使用协商 (Kerberos)。这意味着您需要使用服务主体名称 (SPN) 设置受信任的连接。这可以使用 setspn 命令行工具来完成。不幸的是我没有这方面的经验,因为在开发机器上你往往会跳过它。
http.sys 可以使用 NTLM,但与 IIS / IIS Express 不兼容。这意味着您在使用它时不能使用 Visual Studio 调试。作为一种解决方法,您可以添加一个决定是否使用 http.sys 的环境变量。例如,将以下行添加到 launchSettings.json 中的“项目”配置文件:
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"USE_HTTP_SYS": "true"
}
现在可以有条件地使用或不使用 http.sys:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>
{
if (bool.Parse(Environment.GetEnvironmentVariable("USE_HTTP_SYS") ?? "false"))
{
webBuilder.UseHttpSys(options =>
{
options.Authentication.Schemes = AuthenticationSchemes.NTLM;
options.Authentication.AllowAnonymous = false;
});
}
webBuilder.UseStartup<Startup>();
});
作为旁注,从 .NET Core 3.0 开始,有一个新接口“IHostBuilder”而不是“IWebHostBuilder”(仅为向后兼容而存在)。
遗憾的是,当您使用“dotnet run”并转到该网站时,您可能会看到一条错误消息:
- Internet Explorer:无法安全连接到此页面
- Chrome:无法访问此站点
- Firefox:无法连接
Kestrel 带来了它自己的证书管理。它在用户模式下运行并在“CurrentUser\My”中查找证书。相比之下 http.sys 是内核模式,这意味着当前用户是未知的。 http.sys 在“LocalMachine\My”中查找证书。
由于http.sys不知道端口使用的是哪个证书,所以还需要将证书分配给.net应用的https端口。这需要以本地管理员身份通过 PowerShell 完成:
$cert = Get-ChildItem -Path Cert:\LocalMachine\My | Where { $_.Subject -eq "CN=localhost" } | Select -First 1
netsh http add sslcert ipport=0.0.0.0:5001 appid='{12345678-1234-43f8-a778-f05f3c6b9709}' certhash=$($cert.Thumbprint)
请注意,“CN=localhost”是 uri,“0.0.0.0:5001”是 dotnet 应用程序的端口,appid 是随机标识符(如果您的应用程序有 guid,您也可以使用它,但它是不需要)。
如果您没有证书(例如用于开发),您可以为机器创建一个自签名证书(需要 Win10 和管理员权限):
$rootextension = [System.Security.Cryptography.X509Certificates.X509BasicConstraintsExtension]::new($true, $true, 0, $true)
$cert = New-SelfSignedCertificate -Subject "CN=localhost" -FriendlyName "Development localhost Certificate" -Extension $rootextension -NotAfter ([DateTime]::Now).AddYears(10) -KeyUsage DigitalSignature,KeyEncipherment,DataEncipherment -CertStoreLocation "Cert:\LocalMachine\My" -KeyExportPolicy Exportable