Windows サービスでホストされている Kestrel の Windows 認証 質問する

Windows サービスでホストされている Kestrel の Windows 認証 質問する

ここで説明されているように、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

おすすめ記事