ASP.NET Core で Windows 認証を構成する

作成者: Scott Addie

Windows 認証 (Negotiate、Kerberos、または NTLM 認証とも呼ばれます) は、 IISkestrelHTTP.sysでホストされている ASP.NET Core アプリに対して構成できます。

Windows 認証 (Negotiate、Kerberos、または NTLM 認証とも呼ばれます) は、 IISまたはHTTP.sysでホストされる ASP.NET Core アプリ用に構成できます。

Windows 認証では、オペレーティングシステムに依存して ASP.NET Core アプリのユーザーを認証します。 サーバーが企業ネットワーク上で Active Directory ドメイン id または Windows アカウントを使用してユーザーを識別する場合は、Windows 認証を使用できます。 Windows 認証は、ユーザー、クライアントアプリ、および web サーバーが同じ Windows ドメインに属しているイントラネット環境に最適です。

注意

Windows 認証は、HTTP/2 ではサポートされていません。 認証チャレンジは HTTP/2 応答で送信できますが、認証する前にクライアントを HTTP/1.1 にダウングレードする必要があります。

プロキシとロードバランサーのシナリオ

Windows 認証は、主にイントラネットで使用されるステートフルなシナリオであり、プロキシまたはロードバランサーは通常、クライアントとサーバー間のトラフィックを処理しません。 プロキシまたはロードバランサーが使用されている場合、Windows 認証はプロキシまたはロードバランサーの場合にのみ機能します。

  • 認証を処理します。
  • 認証情報に対して動作するユーザー認証情報をアプリに渡します (要求ヘッダーなど)。

プロキシとロードバランサーを使用する環境での Windows 認証の代わりに、OpenID Connect (OIDC) を使用したフェデレーションサービス (ADFS) Active Directory ます。

IIS/IIS Express

AddAuthenticationで (名前空間) を呼び出して認証サービスを追加し Microsoft.AspNetCore.Server.IISIntegration Startup.ConfigureServices ます。

services.AddAuthentication(IISDefaults.AuthenticationScheme);

起動設定 (デバッガー)

起動設定の構成は、IIS Express のファイルのプロパティ/launchSettings.jsにのみ影響し、Windows 認証用に IIS を構成することはありません。 サーバーの構成については、「 IIS 」セクションを参照してください。

Visual Studio または .NET Core CLI で使用できるWeb アプリケーションテンプレートは、Windows 認証をサポートするように構成できます。これにより、ファイルのプロパティや launchSettings.jsが自動的に更新されます。

新しいプロジェクト

  1. 新しいプロジェクトを作成します。
  2. [ASP.NET Core Web アプリケーション] を選択します。 [次へ] を選択します。
  3. [プロジェクト名] フィールドに名前を入力します。 [場所] エントリが正しいことを確認します。または、プロジェクトの場所を指定します。 [作成] を選択します。
  4. [認証] で [変更] を選択します。
  5. [認証の変更] ウィンドウで、[ Windows 認証] を選択します。 [OK] を選択します。
  6. [Web アプリケーション] を選択します。
  7. [作成] を選択します

アプリケーションを実行します。 ユーザー名は、表示されるアプリのユーザーインターフェイスに表示されます。

既存のプロジェクト

プロジェクトのプロパティは、Windows 認証を有効にし、匿名認証を無効にします。

  1. ソリューション エクスプローラーでプロジェクトを右クリックして、 [プロパティ] を選択します。
  2. [デバッグ] タブを選択します。
  3. [匿名認証を有効にする] のチェックボックスをオフにします。
  4. [ Windows 認証を有効にする] チェックボックスをオンにします。
  5. プロパティページを保存して閉じます。

または、ファイルのlaunchSettings.jsのノードでプロパティを構成することもでき iisSettings ます。 launchSettings.json

"iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": false,
    "iisExpress": {
        "applicationUrl": "http://localhost:52171/",
        "sslPort": 44308
    }
}

既存のプロジェクトを変更する場合は、プロジェクトファイルにAspNetCore メタパッケージまたAspNetCore NuGet パッケージのパッケージ参照が含まれていることを確認します。

IIS

IIS では、 ASP.NET Core モジュールを使用して ASP.NET Core アプリをホストします。 Windows 認証は、 web.configファイルを介して IIS 用に構成されます。 以下のセクションでは、その方法について説明します。

  • アプリの展開時にサーバーで Windows 認証をアクティブ化するローカルweb.configファイルを指定します。
  • サーバーに既に配置されている ASP.NET Core アプリのweb.configファイルを構成するには、IIS マネージャーを使用します。

まだインストールしていない場合は、IIS で ASP.NET Core アプリをホストできるようにします。 詳細については、「IIS を使用した Windows での ASP.NET Core のホスト」を参照してください。

Windows 認証で IIS 役割サービスを有効にします。 詳細については、「 IIS 役割サービスで Windows 認証を有効にする (手順2参照)」を参照してください。

IIS 統合ミドルウェアは、既定で自動的に要求を認証するように構成されています。 詳細については、「 iis を使用した Windows でのホスト ASP.NET Core: iis オプション (自動認証)」を参照してください。

ASP.NET Core モジュールは、既定で Windows 認証トークンをアプリに転送するように構成されています。 詳細については、「 ASP.NET Core モジュール構成リファレンス: aspNetCore 要素の属性」を参照してください。

次のいずれかの方法を使用します。

  • プロジェクトを発行して配置する前に、 次のweb.configファイルをプロジェクトのルートに追加します。

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <location path="." inheritInChildApplications="false">
        <system.webServer>
          <security>
            <authentication>
              <anonymousAuthentication enabled="false" />
              <windowsAuthentication enabled="true" />
            </authentication>
          </security>
        </system.webServer>
      </location>
    </configuration>
    

    プロジェクトが .NET Core SDK によって発行された場合 (プロジェクトファイルのプロパティがに設定されていない場合 <IsTransformWebConfigDisabled> true )、発行されたweb.configファイルにはセクションが含まれ <location><system.webServer><security><authentication> ます。 プロパティの詳細につい <IsTransformWebConfigDisabled> ては、「」を参照してください IIS を使用した Windows での ASP.NET Core のホスト

  • プロジェクトを発行および配置した後、 IIS マネージャーを使用してサーバー側の構成を実行します。

    1. IIS マネージャーで、[接続] サイドバーの [サイト] ノードの下の [iis] サイトを選択します。
    2. IIS領域で [認証] をダブルクリックします。
    3. [匿名認証] を選択します。 [アクション] サイドバーで [無効] を選択します。
    4. [Windows 認証] をクリックします。 [アクション] サイドバーで [有効化] を選択します。

    これらの操作を実行すると、IIS マネージャーによって、アプリのweb.configファイルが変更されます。 <system.webServer><security><authentication>ノードは、およびの更新された設定を使用して追加され anonymousAuthentication windowsAuthentication ます。

    <system.webServer>
      <security>
        <authentication>
          <anonymousAuthentication enabled="false" />
          <windowsAuthentication enabled="true" />
        </authentication>
      </security>
    </system.webServer>
    

    <system.webServer>IIS マネージャーによってweb.configファイルに追加されたセクションは、 <location> アプリの発行時に .NET Core SDK によって追加されたアプリのセクションの外部にあります。 セクションはノードの外側に追加されるため <location> 、設定はサブアプリによって現在のアプリに継承されます。 継承を防止するには、 <security> .NET Core SDK 提供されたセクション内に追加されたセクションを移動し <location><system.webServer> ます。

    Iis マネージャーを使用して IIS 構成を追加すると、サーバー上のアプリのweb.configファイルにのみ影響します。 サーバーのweb.configのコピーがプロジェクトのweb.configファイルで置き換えられた場合、その後のアプリの展開では、サーバーの設定が上書きされる可能性があります。 設定を管理するには、次のいずれかの方法を使用します。

    • 展開時にファイルが上書きされた後、IIS マネージャーを使用して、 web.configファイルの設定をリセットします。
    • 設定を使用して、アプリケーションにweb.config ファイルをローカルに追加します。

Kestrel

Windows、Linux、macOS で Negotiate と Kerberos を使用した Windows 認証をサポートするために、 Kestrelと共にAspNetCore NuGet パッケージを使用できます。

警告

資格情報は、接続時に要求間で永続化できます。 プロキシが Kestrel と1:1 の接続関係 (永続的な接続) を維持していない限り、プロキシでネゴシエート認証を使用することはできません。

注意

Negotiate ハンドラーは、基になるサーバーが Windows 認証をネイティブでサポートしているかどうかを検出します (有効になっている場合)。 サーバーが Windows 認証をサポートしていても無効になっている場合は、サーバーの実装を有効にするように求めるエラーがスローされます。 サーバーで Windows 認証が有効になっている場合は、ネゴシエートハンドラーによって透過的に転送されます。

でおよびを呼び出して、認証サービスを追加 AddAuthenticationAddNegotiate Startup.ConfigureServices ます。

// using Microsoft.AspNetCore.Authentication.Negotiate;
// using Microsoft.Extensions.DependencyInjection;

services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
   .AddNegotiate();

でを呼び出して認証ミドルウェアを追加し UseAuthentication Startup.Configure ます。

app.UseAuthentication();

ミドルウェアの詳細については、「」を参照してください ASP.NET Core のミドルウェア

匿名要求が許可されます。 ASP.NET Core 承認を使用して、認証のための匿名要求をチャレンジします。

Windows 環境構成

AspNetCoreコンポーネントは、ユーザーモード認証を実行します。 サービスプリンシパル名 (Spn) は、コンピューターアカウントではなく、サービスを実行しているユーザーアカウントに追加する必要があります。 setspn -S HTTP/myservername.mydomain.com myuser管理コマンドシェルでを実行します。

Linux および macOS 環境構成

Linux または macOS コンピューターを Windows ドメインに参加させる手順については、「 windows 認証を使用した SQL Server への Azure Data Studio の接続」を参照してください。 この手順では、ドメイン上の Linux マシン用のコンピューターアカウントを作成します。 Spn をそのコンピューターアカウントに追加する必要があります。

注意

Windows 認証を使用して SQL Server に Azure Data Studio 接続する-Kerberos 」のガイダンスに従っている場合は、必要に応じ python-software-properties てをに置き換え python3-software-properties ます。

Linux または macOS コンピューターがドメインに参加したら、次の手順に従って、キータブファイルに spn を指定する必要があります。

  • ドメインコントローラーで、新しい web サービス Spn をコンピューターアカウントに追加します。
    • setspn -S HTTP/mywebservice.mydomain.com mymachine
    • setspn -S HTTP/mywebservice@MYDOMAIN.COM mymachine
  • Ktpassを使用して、キータブファイルを生成します。
    • ktpass -princ HTTP/mywebservice.mydomain.com@MYDOMAIN.COM -pass myKeyTabFilePassword -mapuser MYDOMAIN\mymachine$ -pType KRB5_NT_PRINCIPAL -out c:\temp\mymachine.HTTP.keytab -crypto AES256-SHA1
    • 一部のフィールドは、示されているとおりに大文字で指定する必要があります。
  • キータブファイルを Linux または macOS マシンにコピーします。
  • 環境変数を使用して、キーボックスファイルを選択します。export KRB5_KTNAME=/tmp/mymachine.HTTP.keytab
  • klistを呼び出して、現在使用可能な spn を表示します。

注意

キータブファイルにはドメインアクセス資格情報が含まれており、それに従って保護する必要があります。

HTTP.sys

HTTP.sysは、ネゴシエート、NTLM、または基本認証を使用したカーネルモードの Windows 認証をサポートしています。

AddAuthenticationで (名前空間) を呼び出して認証サービスを追加し Microsoft.AspNetCore.Server.HttpSys Startup.ConfigureServices ます。

services.AddAuthentication(HttpSysDefaults.AuthenticationScheme);

Windows 認証 (Program.cs) で HTTP.sys を使用するようにアプリの web ホストを構成します。 UseHttpSysMicrosoft.AspNetCore.Server.HttpSys 名前空間にあります。

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>()
                    .UseHttpSys(options =>
                    {
                        options.Authentication.Schemes = 
                            AuthenticationSchemes.NTLM | 
                            AuthenticationSchemes.Negotiate;
                        options.Authentication.AllowAnonymous = false;
                    });
            });
}
public class Program
{
    public static void Main(string[] args) => 
        BuildWebHost(args).Run();

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseHttpSys(options =>
            {
                options.Authentication.Schemes = 
                    AuthenticationSchemes.NTLM | 
                    AuthenticationSchemes.Negotiate;
                options.Authentication.AllowAnonymous = false;
            })
            .Build();
}

注意

HTTP.sys では、Kerberos 認証プロトコルを使用したカーネル モード認証に処理が委任されます。 Kerberos および HTTP.sys ではユーザー モード認証がサポートされていません。 Active Directory から取得され、クライアントによって、ユーザーを認証するサーバーに転送される Kerberos トークン/チケットを暗号化解除するには、コンピューター アカウントを使用する必要があります。 アプリのユーザーではなく、ホストのサービス プリンシパル名 (SPN) を登録します。

注意

HTTP.sys は、Nano Server バージョン1709以降ではサポートされていません。 Nano Server で Windows 認証と HTTP.sys を使用するには、 Server Core (microsoft/windowsservercore) コンテナーを使用します。 Server Core の詳細については、「 Windows server の Server core インストールオプションについて」を参照してください。

ユーザーの承認

匿名アクセスの構成の状態によって、 [Authorize] アプリで属性と属性がどのように使用されるかが決まり [AllowAnonymous] ます。 次の2つのセクションでは、匿名アクセスの許可されていない構成と許可される構成の状態の処理方法について説明します。

匿名アクセスを許可しない

Windows 認証が有効になっていて、匿名アクセスが無効になっている場合、 [Authorize] [AllowAnonymous] 属性と属性は影響を与えません。 IIS サイトが匿名アクセスを許可しないように構成されている場合、要求はアプリに到達しません。 このため、属性は [AllowAnonymous] 適用されません。

匿名アクセスを許可する

Windows 認証と匿名アクセスの両方が有効になっている場合は、 [Authorize] 属性と属性を使用し [AllowAnonymous] ます。 [Authorize]属性を使用すると、認証を必要とするアプリのエンドポイントをセキュリティで保護することができます。 属性は、 [AllowAnonymous] [Authorize] 匿名アクセスを許可するアプリの属性よりも優先されます。 属性の使用の詳細については、「」を参照してください ASP.NET Core での単純な ASP.NET Core

注意

既定では、ページにアクセスする権限を持たないユーザーには、空の HTTP 403 応答が表示されます。 Statuscodepages ページミドルウェアは、ユーザーが "アクセス拒否" のエクスペリエンスを向上させるように構成できます。

偽装

ASP.NET Core が偽装を実装していません。 アプリは、アプリプールまたはプロセス id を使用して、すべての要求に対してアプリの id で実行されます。 アプリでユーザーに代わってアクションを実行する必要がある場合は、のターミナルインラインミドルウェアWindowsIdentityを使用します Startup.Configure 。 このコンテキストで1つのアクションを実行し、コンテキストを閉じます。

app.Run(async (context) =>
{
    try
    {
        var user = (WindowsIdentity)context.User.Identity;

        await context.Response
            .WriteAsync($"User: {user.Name}\tState: {user.ImpersonationLevel}\n");

        WindowsIdentity.RunImpersonated(user.AccessToken, () =>
        {
            var impersonatedUser = WindowsIdentity.GetCurrent();
            var message =
                $"User: {impersonatedUser.Name}\t" +
                $"State: {impersonatedUser.ImpersonationLevel}";

            var bytes = Encoding.UTF8.GetBytes(message);
            context.Response.Body.Write(bytes, 0, bytes.Length);
        });
    }
    catch (Exception e)
    {
        await context.Response.WriteAsync(e.ToString());
    }
});

RunImpersonatedは非同期操作をサポートしていないため、複雑なシナリオでは使用できません。 たとえば、要求またはミドルウェアチェーン全体のラップはサポートされていないか、推奨されません。

AspNetCoreパッケージは Windows、Linux、および macOS での認証を有効にしますが、偽装は windows でのみサポートされています。

要求の変換

IIS でホストする場合、は、 AuthenticateAsync ユーザーを初期化するために内部では呼び出されません。 そのため、認証のたびに要求を変換するための IClaimsTransformation 実装は既定で有効になっていません。 クレーム変換をアクティブにするコード例については、「」を参照してください ASP.NET Core モジュール

IIS インプロセスモードでホストする場合、は、 AuthenticateAsync ユーザーを初期化するために内部的に呼び出されません。 そのため、認証のたびに要求を変換するための IClaimsTransformation 実装は既定で有効になっていません。 インプロセスをホストするときに要求変換をアクティブにするコード例と詳細については、「」を参照してください ASP.NET Core モジュール

その他の技術情報