C# MVC5でWeb APIを構築する:基本構成と簡易トークン認証の導入

システム開発
スポンサーリンク
スポンサーリンク

MVC5で構築したWeb API、誰でもアクセスできてしまっては困りますよね。この記事では、MVC5(.NET Framework)環境で最小限のコーディングで実装できる「簡易トークン認証」によるAPI保護方法をご紹介します。

既存システムに組み込みやすく、JWTやOAuth導入前の足掛かりとしても有効です。この記事の手順に沿えば、コピペしながら動作確認できるWeb APIを作成できます。

Step 1:プロジェクトを作成する

  • Visual Studioで「ASP.NET Webアプリケーション(.NET Framework)」を選択
  • テンプレートは「MVC」を選択(Web APIを含まなくてもOK)

✏️ 補足:

MVCテンプレートで問題ありません。Web APIはMVCとは別ルーティングエンジンを持っているため、MVCプロジェクトに後からWeb API構成(コントローラーやルーティング)を追加することが可能です。実際、既存のMVCサイトにもWeb API機能を後付けで追加できます。

Step 2:Web APIのルーティングを設定する

MVCとWeb APIは異なるルーティングエンジンを持ちます。MVCは System.Web.Mvc.RouteCollection を使い、Web APIは System.Web.Http.HttpConfiguration を使います。したがって、設定ファイルも通常は別々に管理します。

✏️ 補足:

技術的にはMVCの RouteConfig.cs にWeb APIのルート設定を記述することも可能ですが、推奨されません。なぜなら、MVCとWeb APIではルートの記述方式や処理されるハンドラが異なるため、設定が混在すると保守性が低下するためです。ファイルを分けておくことで、将来的な拡張や調査がしやすくなります。

WebApiConfig.csApp_Start フォルダに追加

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

Global.asax.cs にルート登録を追記

protected void Application_Start()
{
    GlobalConfiguration.Configure(WebApiConfig.Register);
    AreaRegistration.RegisterAllAreas();
    RouteConfig.RegisterRoutes(RouteTable.Routes);
}

Step 3:サンプルAPIを作成する

Product.cs モデルクラスを Models フォルダに追加

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Price { get; set; }
}

ProductsController.csControllers に追加

public class ProductsController : ApiController
{
    public IEnumerable<Product> Get()
    {
        return new List<Product>
        {
            new Product { Id = 1, Name = "ノートPC", Price = 120000 },
            new Product { Id = 2, Name = "モニター", Price = 30000 }
        };
    }
}

✏️ 補足:

このAPIは標準でJSON形式でレスポンスを返しますが、HTTPの Accept ヘッダーを使うことで、XML形式でも取得可能です。

たとえば以下のように指定します:

curl -H "Accept: application/xml" <http://localhost>:ポート番号/api/products

XMLを無効にしたい場合は、WebApiConfig.cs で次のコードを追加すればJSON専用APIになります:

config.Formatters.Remove(config.Formatters.XmlFormatter);

✅ なお、Step 3のコード(ProductsControllerなど)はそのままで構いません。ASP.NET Web APIはコンテンツネゴシエーションに対応しており、特別な変更を加えなくても Accept ヘッダーに応じてJSONやXMLなどを自動的に切り替えてくれます。

Step 4:APIの動作確認を行う

APIが正しく動作しているかどうかを、次の3つの方法で確認できます:

  • コマンドラインツール「curl」
  • GUIツール「Postman」
  • Chrome拡張機能「API Tester」

✅ curlで確認する場合

curl はコマンドラインでHTTPリクエストを送信できるツールです。以下のように入力することで、APIにアクセスしてレスポンスを確認できます。

curl <http://localhost>:ポート番号/api/products

実行後の出力例(JSON形式):

[
  { "Id": 1, "Name": "ノートPC", "Price": 120000 },
  { "Id": 2, "Name": "モニター", "Price": 30000 }
]

🔍 curlがインストールされていない場合は、Windowsでは「Git Bash」や「PowerShell」、Macではターミナルから利用可能です。

✅ Postmanで確認する場合

Postman はGUIベースでAPIをテストできる便利なツールです。

  1. Postmanを起動します
  2. 新しいリクエストタブを開きます
  3. 以下のように設定します:
    • メソッドGET
    • URLhttp://localhost:ポート番号/api/products
  4. 必要に応じて「Headers」タブで Accept: application/json を指定(省略可)
  5. 「Send」ボタンをクリックすると、レスポンスペインにJSONが表示されます

📝 Postmanは公式サイト(https://www.postman.com/)から無料でダウンロードできます。

✅ API Testerで確認する場合

API Tester はChromeの拡張機能として提供されている軽量なREST APIテストツールです。Postmanと同様にGUIでAPIを送信できますが、インストールが簡単で手軽に使えます。

  1. Chrome ウェブストアで「API Tester」を検索し、拡張機能として追加します
  2. 拡張機能を起動し、次のように設定します:
    • MethodGET
    • URLhttp://localhost:ポート番号/api/products
  3. 必要に応じてヘッダーで Accept: application/json を追加します
  4. 「Send Request」ボタンをクリックして実行します

💡 軽量で日本語対応のUIもあるため、初心者にも扱いやすいのが特徴です。

このように、どの方法でもAPIが正しく動作していれば、Product データのリストが返ってきます。

Step 5:簡易トークン認証を導入する

APIを誰でも実行できる状態では、意図しないアクセスや情報漏洩のリスクがあります。そこで、簡単な「トークン認証」でAPIへのアクセスを制限してみましょう。

このステップでは、特定の値(トークン)が Authorization ヘッダーに含まれている場合だけ、APIの処理を許可するようにします。

✅ 1. 認証フィルターを作成する

まずは、受信したリクエストにトークンが含まれているかどうかを判定するクラスを Filters フォルダに作成します。

public class TokenAuthAttribute : AuthorizationFilterAttribute
{
    // 許可するトークン値(ここでは固定値)
    private const string Token = "your-secret-token";

    public override void OnAuthorization(HttpActionContext actionContext)
    {
        IEnumerable<string> authHeaderValues;
        if (actionContext.Request.Headers.TryGetValues("Authorization", out authHeaderValues))
        {
            var token = authHeaderValues.FirstOrDefault();
            if (token == Token)
            {
                // トークンが一致すれば許可
                return;
            }
        }

        // トークンがない or 不正な場合は401(認証エラー)を返す
        actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized, "Unauthorized");
    }
}

✅ 2. コントローラーに認証を適用する

上記のフィルターをAPIコントローラーに適用します。

[TokenAuth] // この1行で認証が有効に
public class ProductsController : ApiController
{
    public IEnumerable<Product> Get()
    {
        return new List<Product>
        {
            new Product { Id = 1, Name = "ノートPC", Price = 120000 },
            new Product { Id = 2, Name = "モニター", Price = 30000 }
        };
    }
}

✅ 3. トークンを付けてアクセスする方法(curl)

トークンなしでアクセスすると「401 Unauthorized」が返ってきます。

トークンを含めるには、以下のように Authorization ヘッダーを付けます:

curl -H "Authorization: your-secret-token" <http://localhost>:ポート番号/api/products

🧪 PostmanやAPI Testerでも、Headersに「Authorization」キーと「your-secret-token」値を設定すれば確認できます。

public class TokenAuthAttribute : AuthorizationFilterAttribute
{
    private const string Token = "your-secret-token";
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        IEnumerable<string> authHeaderValues;
        if (actionContext.Request.Headers.TryGetValues("Authorization", out authHeaderValues))
        {
            var token = authHeaderValues.FirstOrDefault();
            if (token == Token)
            {
                return;
            }
        }

        actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized, "Unauthorized");
    }
}

✅ 4. 認証の適用コードを再確認

すでに紹介したように、コントローラーに [TokenAuth] 属性を付けるだけで認証が有効になります。 以下は認証フィルターを適用した ProductsController の例です:

[TokenAuth] // 認証フィルターを適用
public class ProductsController : ApiController {

    public IEnumerable<Product> Get()
    {
        return new List<Product>
        {
            new Product { Id = 1, Name = "ノートPC", Price = 120000 },
            new Product { Id = 2, Name = "モニター", Price = 30000 }
        };
    }
}

このように [TokenAuth] 属性を付与することで、認証フィルターが自動的に働き、トークンが一致する場合のみAPIの処理が実行されます。

✅ 5. トークン付きでアクセスする例(curl)

認証が有効になると、トークンが正しく付いていないリクエストは拒否(401 Unauthorized)されます。

以下のように Authorization ヘッダーを付けることで、認証が通ります:

curl -H "Authorization: your-secret-token" <http://localhost>:ポート番号/api/products

🧪 Postman や API Tester の場合:

  • 「Headers」タブを開く
  • Authorization キーに your-secret-token を設定
  • リクエストを送信

このようにして、簡易的なセキュリティ対策が可能になります。

Step 6:よくあるエラーと対処法

Web API開発では、環境によってさまざまなエラーに遭遇します。以下によくあるエラーとその原因、対処方法を詳しくまとめました。

症状 原因 対処法
404 Not Found URLの指定ミス、ルーティング設定が正しくない WebApiConfig.cs にて api/ プレフィックスが付いているか確認し、ルートの定義が正しいか確認します。また、Global.asax.csApplication_StartWebApiConfig.Register を呼び出しているかも要チェックです。
401 Unauthorized トークン未設定・値の誤り・認証フィルターの未適用 API呼び出し時に Authorization ヘッダーが付与されているか、値が正しいか確認してください。また、コントローラーに [TokenAuth] 属性が付いているかもチェックしましょう。
コントローラーが呼ばれない クラス名やファイル名が誤っている、ApiController を継承していない コントローラークラスが ApiController を継承しているか確認します。ファイル名とクラス名が一致しているか、ルーティングに合った命名規則になっているかも重要です。
XMLで返らない クライアントが正しい Accept ヘッダーを指定していない Accept: application/xml を明示的に指定し、必要であれば WebApiConfig.cs にて XmlFormatter が有効かどうかを確認してください。
PostmanやAPI Testerでレスポンスが空になる リクエストヘッダーやURLの誤り、ローカルサーバー未起動 ポート番号が正しいか、APIのエンドポイントが正確か確認してください。また、IIS Express や開発サーバーが正しく起動しているかも確認しましょう。

まとめ

今回ご紹介した方法を使えば、MVC5プロジェクトにWeb API機能を手軽に追加し、最小限のコーディングで認証機能を導入できます。

特に以下の点を押さえておくと良いでしょう:

  • MVCプロジェクトにWeb APIを追加するには、WebApiConfig.cs によるルーティング設定が重要。
  • サンプルAPIを作る際は、JSONとXMLの両形式に対応していることを理解しておくと便利。
  • curl、Postman、API Testerなどを使えば、ブラウザだけでなく外部からのAPI動作確認が簡単に行える。
  • 簡易トークン認証はセキュリティの第一歩。Authorization ヘッダーを使うことで、基本的なアクセス制御が可能になる。
  • より堅牢な設計を目指すなら、今後は以下のような仕組みにステップアップするのがおすすめ:
    • CORS対応:外部サイトから安全にAPIを呼び出すための設定
    • JWT認証:署名付きのトークンによるより強固な認証方法
    • OAuth + OWIN:サードパーティ連携や認可機能に対応した本格的な認証方式

まずは今回の手順でAPI構築に慣れ、徐々にステップアップしていきましょう。

システム開発
スポンサーリンク
tobotoboをフォローする

コメント

タイトルとURLをコピーしました