IIS7.0のASP.NET統合機能

マイクロソフト畠山です。
既にRTMされた、Windows Server 2008に搭載されているIIS7.0のASP.NET統合機能ですが、どんな事に使えるかと調べていました。今日は、その中での発見を。実案件で使えるかは要件次第ですが。

PHPで動いているサイトに、ASP.NETのフォーム認証の機能が、開発無しで動きます!
参考: 統合 ASP.NET パイプラインでアプリケーションを拡張する

以下に前提と手順を。

[前提]

  • 認証情報は、ASP.NET 2.0の標準フレームワークをそのまま使う。ID管理は、標準で使えるSQL Serverを (aspnet_regiis.exeで作成されるものを)
  • 認証サイトは、IIS7.0とASP.NET2.0でホスティング
  • PHPが動作しているサイトは、IIS7.0に

[ポイント]

  • web.configで、<machine key>は、全IISで同一のものに。これでCookie暗号化/複合化のキーが共有されます

[手順]

  1. まずは、フォーム認証サイトを構築します。ここでは、特に特別なことはしません。
    参照: 簡単なフォーム認証を実装する
    以下、動作確認です。
    image
    image
    ※SQL Serverにユーザーデータを作成するのを忘れないでください。Visual Studioの管理ツールから作成するのが便利です。実際には、ASP.NETのMemberShipクラスで作成できますが。
    image
    image
  2. PHPのサンプルプログラムを作成します。ここでは、以下の様なシンプルなものを。
    ——- PHPソース ——————
  3. <html>
        <head>
            <title>PHP Test</title>
        </head>
        <body>
            <H1 >
    <?php echo ‘<p>Hello World</p>’; ?>
            </H1>
    <hr />
    <?php echo date(‘Y/m/d’); ?>
            <hr />
    <?php phpinfo(); ?>
        </body>
    </html>
    ———————————–
    以下、実行結果を。
    image

  4. IIS7.0の管理コンソールで、PHPをホストしているサイトを「Webアプリケーション」に変換。
    image
  5. そして、アプリケーションプールのパイプライン モードが、「統合」になっているものを選択します。
    image
    このまま実行しても、先のPHPの実行結果を同じです。
  6. 以下の様なweb.configファイルを作成し、PHPをホストしているWebアプリケーションに置きます。
    —————- web.configの内容 ——————–
  7. <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <system.webServer>
            <!– FormsAuthentication module を再登録します。 –>
            <modules>
                <remove name="FormsAuthentication" />
                <add name="FormsAuthentication" type=
                    "System.Web.Security.FormsAuthenticationModule" />
            </modules>
        </system.webServer>

      <system.web>
        <authentication mode="Forms">
          <forms
            enableCrossAppRedirects="true"
            loginUrl="http://localhost/IntegratedAuthentication/login.aspx&quot;
            defaultUrl="http://localhost/PHP/index.php&quot;
            />
        </authentication>

        <authorization>
          <deny users="?"/>
        </authorization>

        <machineKey
          validationKey="<最初のweb.configと同じもの>"
          decryptionKey="<最初のweb.configと同じもの>"
          validation="SHA1" />

      </system.web>

    </configuration>

  8. IIS7.0の管理コンソールで、PHPサイトのIIS上の「匿名認証」を無効にします。
    ※この設定も、上記web.configに含められるようです。私自身は調査中です。
    image

いかがですか?
勿論、これだけで全てを解決できるわけではありませんが、なぜ、IISにASP.NET統合モードが存在するのか?そのパワーを見た気がします。ここでは、IISのパイプライン処理に含まれている認証情報だけピックアップしてみましたが、その他でも活用できるものがあるかもしれませんね。

2008/2/15
マイクロソフト株式会社
畠山大有