IIS Express (Visual Studio 開発環境) で IIS CORS モジュールを利用する

本記事は IIS Express に IIS 用のモジュールである [IIS CORS Module](https://www.iis.net/downloads/microsoft/iis-cors-module) を導入する方法の紹介です。IIS Express は Visual Studio 2019 環境にて ASP.NET Core アプリ等のデバッグ実行時のホスト環境として利用できる開発用 Web サーバー環境です。

## 概要
[IIS CORS Module](https://www.iis.net/downloads/microsoft/iis-cors-module) を IIS で利用する機会が今まであったのですが、今回 Visual Studio 2019 の IIS Express 環境でも IIS CORS Module を利用する機会があったので、その方法を記載いたします。

## 経緯
IIS 上で ASP.NET Core アプリをホストしており、かつ Windows 認証を利用するシナリオでは ASP.NET Core の CORS 用のミドルウェアが残念ながら利用できません。

これは公式ドキュメントの [IIS での CORS](https://docs.microsoft.com/ja-jp/aspnet/core/security/cors?view=aspnetcore-3.1#cors-in-iis) にも記載があります。このシナリオをサポートするには、ASP.NET Core アプリ側の CORS ミドルウェアではなく、**IIS の CORS モジュール**を利用するように構成する必要があります。

IIS に CORS モジュールを導入することはシンプルでモジュールを IIS にインストールするだけなんですが、今回開発環境の IIS Express にも同様に導入し、開発時も問題なく検証できるようにしたかったためやや特殊な導入が必要だったという経緯があります。

## 今回の環境
上記のように IIS 上の ASP.NET Core アプリで Windows 認証を設定する必要性があったため、CORS モジュールを利用する必要が出てきました。また、今回は開発環境の IIS Express (VS) でも同様の構成を実施したく検証しました。

- アプリ : ASP.NET Core Web API (.NET Core 3.1)
- IIS の認証方法 : Windows 認証
- IDE : Visual Studio 2019 + IIS Express

## 前提
IIS、ASP.NET Core アプリの動作に必要なランタイムや Visual Studio 2019 は既にインストール済みで、かつ [IIS CORS Module](https://www.iis.net/downloads/microsoft/iis-cors-module) を事前にインストールしている前提です。なお今回、IIS CORS Module のサイトにある x64 installer よりインストーラーでインストールしました。

# 手順

## 1. VS プロジェクト内の applicationhost.config 変更
{プロジェクト フォルダ} \\.vs\Sample\config\applicationhost.config に以下を追加します。

1-1. cors の section を sectionGroup に追加。

```
<sectionGroup name="system.webServer">
  ...
  <section name="cors" overrideModeDefault="Allow" />
```

1-2. CorsModule を globalModules に追加。

```
<globalModules>
  ...
  <add name="CorsModule" image="%SystemRoot%\system32\inetsrv\iiscors.dll" />
</globalModules>
```

1-3. CorsModule を path="" の location 内に追加。

```
<location path="" overrideMode="Allow">
  <system.webServer>
    <modules>
      ...
      <add name="CorsModule" />
    </modules>
    ...
```

## 2. IIS Express のスキーマに CORS 用スキーマ追加
C:\Windows\System32\inetsrv\config\schema にある cors_schema.xml を C:\Program Files\IIS Express\config\schema にコピーします。

## 補足 : プロジェクト内の web.config に CORS モジュールの定義を要件に合わせて追加
以下、定義例です。[IIS CORS module Configuration Reference](https://docs.microsoft.com/en-us/iis/extensions/cors-module/cors-module-configuration-reference) 等を参考に適宜変更ください。

```
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.webServer>
        <cors enabled="true" failUnlistedOrigins="true">
            <add origin="http://localhost:4500" allowCredentials="true">
                <allowHeaders allowAllRequestedHeaders="true" />
                <allowMethods>
                    <add method="GET" />
                    <add method="POST" />
                </allowMethods>
            </add>
        </cors>
    </system.webServer>
</configuration>
```

## 参考情報
- IIS CORS Module - https://www.iis.net/downloads/microsoft/iis-cors-module
- IIS CORS module Configuration Reference - https://docs.microsoft.com/en-us/iis/extensions/cors-module/cors-module-configuration-reference
- ASP.NET Core でのクロスオリジン要求 (CORS) を有効にする ~ IIS での CORS ~ - https://docs.microsoft.com/ja-jp/aspnet/core/security/cors?view=aspnetcore-5.0#cors-in-iis