Katana で Windows 認証を有効にする

この記事では、Katana で Windows 認証を有効にする方法について説明します。 ここでは、IIS を使用して Katana をホストし、HttpListener を使用してカスタム プロセスで Katana をセルフホストする 2 つのシナリオについて説明します。 この記事をレビューしてくれた Barry Dorrans、David Matson、Chris Ross に感謝します。

Katana は、.NET 用の Open Web インターフェイスである OWIN の Microsoft の実装です。 OWIN と Katana の概要 については、こちらを参照してください。 OWIN アーキテクチャには、いくつかのレイヤーがあります。

  • ホスト: OWIN パイプラインを実行するプロセスを管理します。
  • サーバー: ネットワーク ソケットを開き、要求をリッスンします。
  • ミドルウェア: HTTP 要求と応答を処理します。

Katana は現在、Windows 統合認証をサポートする 2 つのサーバーを提供しています。

  • Microsoft.Owin.Host.SystemWeb。 ASP.NET パイプラインで IIS を使用します。
  • Microsoft.Owin.Host.HttpListenerSystem.Net.HttpListener を使用します。 現在、このサーバーは Katana をセルフホスティングする場合の既定のオプションです。

Note

現在、Katana は Windows 認証用の OWIN ミドルウェアを提供していません。この機能はサーバーで既に使用できるためです。

IIS での Windows 認証

Microsoft.Owin.Host.SystemWeb を使用すると、IIS で Windows 認証を有効にすることができます。

まず、"空の Web アプリケーションの ASP.NET" プロジェクト テンプレートを使用して、新しい ASP.NET アプリケーションを作成します。

例の図

次に、NuGet パッケージを追加します。 [ツール] メニューの [NuGet パッケージ マネージャー] を選択し、[パッケージ マネージャー コンソール] を選択します。 [パッケージ マネージャー コンソール] ウィンドウで、次のコマンドを入力します。

Install-Package Microsoft.Owin.Host.SystemWeb -pre

次に、次のコードを使用して という名前 Startup のクラスを追加します。

using Owin;

namespace KatanaWebHost
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.Run(context =>
            {
                context.Response.ContentType = "text/plain";
                return context.Response.WriteAsync("Hello World!");
            });
        }
    }
}

これで、IIS で実行される OWIN 用の "Hello world" アプリケーションを作成する必要があります。 F5 キーを押してアプリケーションをデバッグします。 ブラウザー ウィンドウに "Hello World!" と表示されます。

図の例

次に、IIS Expressで Windows 認証を有効にします。 [ 表示 ] メニューの [ プロパティ] を選択します。 ソリューション エクスプローラーのプロジェクト名をクリックして、プロジェクトのプロパティを表示します。

[ プロパティ ] ウィンドウで、[ 匿名認証 ] を [無効] に設定し、[ Windows 認証][有効] に設定します。

認証の有効化、図の例

Visual Studio からアプリケーションを実行する場合、IIS Expressにはユーザーの Windows 資格情報が必要です。 これは、Fiddler または別の HTTP デバッグ ツールを使用して確認できます。 HTTP 応答の例を次に示します。

HTTP/1.1 401 Unauthorized
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/8.0
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
X-Powered-By: ASP.NET
Date: Sun, 28 Jul 2013 07:28:51 GMT
Content-Length: 6062
Proxy-Support: Session-Based-Authentication

この応答のWWW-Authenticate ヘッダーは、サーバーが Kerberos または NTLM を使用する Negotiate プロトコルをサポートしていることを示します。

その後、サーバーにアプリケーションを展開するときに、次の 手順 に従って、そのサーバー上の IIS で Windows 認証を有効にします。

HttpListener での Windows 認証

Microsoft.Owin.Host.HttpListener を使用して Katana をセルフホストしている場合は、 HttpListener インスタンスで Windows 認証を直接有効にすることができます。

まず、新しいコンソール アプリケーションを作成します。 次に、NuGet パッケージを追加します。 [ツール] メニューの [NuGet パッケージ マネージャー] を選択し、[パッケージ マネージャー コンソール] を選択します。 [パッケージ マネージャー コンソール] ウィンドウで、次のコマンドを入力します。

Install-Package Microsoft.Owin.SelfHost -Pre

次に、次のコードを使用して という名前 Startup のクラスを追加します。

using Owin;
using System.Net;

namespace KatanaSelfHost
{
    class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            HttpListener listener = 
                (HttpListener)app.Properties["System.Net.HttpListener"];
            listener.AuthenticationSchemes = 
                AuthenticationSchemes.IntegratedWindowsAuthentication;

            app.Run(context =>
            {
                context.Response.ContentType = "text/plain";
                return context.Response.WriteAsync("Hello World!");
            });
        }
    }
}

このクラスは、以前と同じ "Hello world" の例を実装しますが、認証スキームとして Windows 認証も設定します。

関数内で Main 、OWIN パイプラインを開始します。

using Microsoft.Owin.Hosting;
using System;

namespace KatanaSelfHost
{
    class Program
    {
        static void Main(string[] args)
        {
            using (WebApp.Start<Startup>("http://localhost:9000"))
            {
                Console.WriteLine("Press Enter to quit.");
                Console.ReadKey();
            }        
        }
    }
}

Fiddler で要求を送信して、アプリケーションが Windows 認証を使用していることを確認できます。

HTTP/1.1 401 Unauthorized
Content-Length: 0
Server: Microsoft-HTTPAPI/2.0
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
Date: Sun, 28 Jul 2013 21:02:21 GMT
Proxy-Support: Session-Based-Authentication

プロジェクト Katana の概要

System.Net.HttpListener

MVC 5 での OWIN フォーム認証について