概要
ASP.NET Web APIにHTTPSを適用して、IIS Express上で動作確認する。
動作環境
IDE
Visual Studio Community 2017 15.9.36
・ ASP.NET and Web Tools 2017 15.9.04012.0
・ ASP.NET Core Razor Language Services 15.8.31590
・ ASP.NET Web Frameworks and Tools 5.2.61435.0
Application
ASP.NET Webアプリケーション(.NET Framework)
・ C#/Web API
ブラウザ
Google Chrome 91.0.4472.164
全体の流れ
評価用APIを作成する。
AuthorizationFilterAttributeを継承したカスタムフィルタクラスを定義する。
カスタムフィルタをAPIConfigに登録する。
makecert.exeを用いてテスト用のクライアント証明証を作成する。
Visual Studioの開発サーバのHTTPSサーポートの有効化する 。
IIS ExpressでHTTPS接続の動作確認する 。
評価用APIを作成する
データモデルクラスを定義する
Product.cs
namespace WebServer.Models
{
/// <summary>
/// 製品
/// </summary>
public class Product
{
/// <summary>
/// ID
/// </summary>
public int Id { get; set; }
/// <summary>
/// 名前
/// </summary>
public string Name { get; set; }
/// <summary>
/// 価格
/// </summary>
public decimal Price { get; set; }
/// <summary>
/// カテゴリー
/// </summary>
public string Category { get; set; }
}
}
コントローラを定義する
ProductsController.cs
using System;
using System.Linq;
using System.Web.Http;
using WebServer.Models;
namespace WebServer.Controllers
{
/// <summary>
/// 製品のイベントハンドラ
/// </summary>
public class ProductsController : ApiController
{
/// <summary>
/// 製品情報
/// </summary>
private static Product[] _products = new Product[]
{
new Product {Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1},
new Product {Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M},
new Product {Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M}
};
/// <summary>
/// 製品情報をすべて取得する
/// </summary>
/// <returns></returns>
public IHttpActionResult GetAllProducts()
{
return Ok(_products);
}
}
}
AuthorizationFilterAttributeを継承したカスタムフィルタクラスを定義する
RequireHttpsAttribute.cs
using System;
using System.Net;
using System.Net.Http;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
namespace WebServer
{
/// <summary>
/// HTTPSの認証フィルタ(カスタムクラス)
/// </summary>
public class RequireHttpsAttribute : AuthorizationFilterAttribute
{
/// <summary>
/// 認証時に呼び出されるコールバック関数
/// </summary>
/// <param name="actionContext"></param>
public override void OnAuthorization( HttpActionContext actionContext )
{
if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Forbidden)
{
ReasonPhrase = "HTTPS Required"
};
}
else
{
base.OnAuthorization(actionContext);
}
}
}
}
カスタムフィルタをApiConfigに登録する
グローバルな設定として、HTTPSフィルタを適用する。すべてのWeb APIがHTTPS適用となる。
config.Filters.Add(new RequireHttpsAttribute());
WebApiConfig.cs
using System.Web.Http;
namespace WebServer
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API の設定およびサービス
// Web API ルート
config.MapHttpAttributeRoutes();
// HTTPSフィルターを登録する(すべてのWeb APIがHTTPS実行となる)
config.Filters.Add(new RequireHttpsAttribute());
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}
makecert.exeを用いてテスト用のクライアント証明証を作成
makecert.exeの格納場所
私の環境だと、下記フォルダ内に格納されていた。
・ C:\Program Files (x86)\Windows Kits\10\bin
・ C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\microsoft.windows.sdk.buildtools
今回はVisual Studio直下にmakecert.exeを使用する。
テストルート証明期間を作成
(1)Visual Studioの開発者コマンドプロンプトを「管理者権限」で実行する。
(2)下記コマンドを実行する。
makecert.exe -n "CN=Development CA" -r -sv C:\Workspace\TempCA.pvk C:\Workspace\TempCA.cer
※出力パス、ファイル名は任意。
(3)パスワードを入力する。
(4)コマンドプロンプトに[Succeeded]が表示されることを確認する。
証明書をインストールする
ローカルマシンに下記手順で証明書をインストールする。
(1)MMCを開く。
(2)[ファイル] で、 [スナップインの追加と削除] を選択する。
(3)利用可能なスナップインから証明書を選択する。
(4)[追加]ボタンをクリックする。
(5)[ローカルコンピュータアカウント]を選択する。
(6)[次へ]をクリックする。下記画面で[完了]をクリックする。
(7)[OK]を押して、 [スナップインの追加と削除] を閉じる。
(8)[証明書]が下記のように追加される。
(9)[証明書]を展開して、「信頼されたルート証明機関」を選択する。
(10)[すべてのタスク]から[インポート]を選択する。
(11)証明書インポートウィザードが立ち上がる。「次へ」を押す。
(12)証明書を選択して、[次へ]を押す。
(13)[次へ]を押す。
(14)[完了]を押す。
(15)[OK]を押す。
Visual Studioの開発サーバのHTTPSサーポートの有効化
(1)VisualStudioでWeb APIソリューションを開く。
(2)ソリューションエクスプローラで[Web APIプロジェクト]を選択する。
(3)「プロパティウィンドウ」を表示する。
(4)開発サーバのタブを展開して、[SSL有効化]を[True]にする。
SSL URLはHTTPS接続テストに使用するため、控えておく。
IIS ExpressでHTTPS接続を動作テストする
HttpでWeb APIのGetメソッドをコールする
URL
http://localhost:59320/api/products
実行結果:アクセスを拒否される
HttpSでWeb APIのGetメソッドをコールする
URL
https://localhost:44333/api/products
実行結果:Web APIのGetメソッドに成功する
参考にしたサイト
No
リンク
概要
1
httpsとは?htttpとの違いとSSL暗号化の仕組み
httpsの仕組みに関する解説が分かりやすい
2
C# Corner How To Enable HTTPS In ASP.NET Web API
ASP.NET Web APIにHTTPSを適用する手順の記事(英語)
3
MicrosoftDoc Web APIでのSSL操作
公式ドキュメントのSSL操作に関する記事
↧