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.cs
を App_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.cs
を Controllers
に追加
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をテストできる便利なツールです。
- Postmanを起動します
- 新しいリクエストタブを開きます
- 以下のように設定します:
- メソッド:
GET
- URL:
http://localhost:ポート番号/api/products
- メソッド:
- 必要に応じて「Headers」タブで
Accept: application/json
を指定(省略可) - 「Send」ボタンをクリックすると、レスポンスペインにJSONが表示されます
📝 Postmanは公式サイト(https://www.postman.com/)から無料でダウンロードできます。
✅ API Testerで確認する場合
API Tester
はChromeの拡張機能として提供されている軽量なREST APIテストツールです。Postmanと同様にGUIでAPIを送信できますが、インストールが簡単で手軽に使えます。
- Chrome ウェブストアで「API Tester」を検索し、拡張機能として追加します
- 拡張機能を起動し、次のように設定します:
- Method:
GET
- URL:
http://localhost:ポート番号/api/products
- Method:
- 必要に応じてヘッダーで
Accept: application/json
を追加します - 「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.cs の Application_Start で WebApiConfig.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構築に慣れ、徐々にステップアップしていきましょう。
コメント