ここで説明されているように、Windows サービスでホストされている ASP.NET Core アプリケーションを実行しています。
https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-2.1
このアプリケーションで Windows 認証をサポートする必要があります。どのようなオプションがありますか? Windows 認証を使用したリバース プロキシとして IIS のアプリケーション要求ルーティング/URL 書き換えモジュールを使用しようとしましたが、動作させる方法がわかりません。ご指導いただければ幸いです。
ベストアンサー1
.NET Core Web アプリケーションで使用できるさまざまな Web サーバーがあります。
- IIS Express (Visual Studio で F5 キーを押すと)
NTLM、ネゴシエート (Kerberos)
Windows のみをサポート - IIS (IIS フォルダに展開する場合)
NTLM をサポートし、
Windows のみをネゴシエートします - Kestrel (「dotnet run」を使用する場合、またはコマンドラインから実行する場合)
Negotiate をサポート (nuget パッケージを使用、Yush0s の返信を参照)
Windows / Linux - http.sys (kestrel と同様ですが、Startup.cs で設定されます)
NTLM をサポートし、
Windows のみをネゴシエートします
IIS / IIS Express での Windows 認証は問題なく動作します。
Kestrel は Negotiate (Kerberos) のみを使用できます。つまり、サービス プリンシパル名 (SPN) を使用して信頼された接続を設定する必要があります。これは、setspn コマンド ライン ツールを使用して実行できます。残念ながら、開発マシンではこれをスキップする傾向があるため、私はこれについての経験がありません。
http.sys は NTLM を使用できますが、IIS / IIS Express と互換性がありません。つまり、これを使用する場合は Visual Studio デバッグを使用できません。回避策として、http.sys を使用するかどうかを決定する環境変数を追加できます。たとえば、launchSettings.json の "Project" プロファイルに次の行を追加します。
"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 以降では、「IWebHostBuilder」の代わりに新しいインターフェイス「IHostBuilder」があります (下位互換性のためだけに存在します)。
残念ながら、「dotnet run」を使用して Web サイトにアクセスすると、次のエラー メッセージが表示される場合があります。
- 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