0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Azure API Managementのポリシーで複数の値をValidateする方法

Posted at

※本記事は2019年10月17日時点での情報です。

はじめに

API Managementのポリシーでは、様々なフィルターをかけることができるのでとても便利です。呼び出し元のIPアドレスフィルタや、Validate JWTなどエンタープライズでのユースケースに沿った機能が備わっています。

今回自分が悩んだのは、Validateしたい値が複数存在した時の管理方法です。例えばJWTのValidateをさせる際、認証されたユーザーのエイリアス情報を全てポリシーにハードコーディングするのは実用的ではないと思いました。値をどのように管理し、ポリシー側からはどのように呼び出したらいいのか考えましたので、アイデアを共有します。

名前付きの値

API Managementのポリシー内で使える変数と値は、名前付きの値(英語名:Named values)で管理することが出来ます。
参照: https://docs.microsoft.com/ja-jp/azure/api-management/api-management-howto-properties

名前付きの値における変数名と値は1:1だと思い込んでいましたが、実際には1:多で登録を行うことができます。
(値は4096文字までとドキュメントに記載がありますので、ご注意ください。)

例えば、複数のIPアドレスを一つの変数として管理したい場合には、以下のようにカンマ区切りで登録をすることができます。

image.png

ポリシーに対してのハードコードでもこのカンマ区切りは作用しますが、今回は名前付きの値として登録をしました。

ポリシーからの呼び出し

名前付きの値が設定出来たら、ポリシーから値を呼び出します。サンプルコードを以下に示します。

<choose>
 <when condition="@{
   if ("{{HogeSystemServer}}".Contains(context.Request.IpAddress))
   {
     return true; //リストとして登録したIPアドレスだけを許可する
   }
     return false; //その他からのアクセスは403を返す
   }" />
 <otherwise>
  <return-response>
    <set-status code="403" reason="Forbidden" />
  </return-response>
 </otherwise>
</choose>

choose, when, otherwiseは、C言語でいうところのif-else文やswitch文のイメージです。
参照: https://docs.microsoft.com/ja-jp/azure/api-management/api-management-advanced-policies#choose

これで一つの変数を用いて、複数の値をポリシーでValidateすることができます。

テスト

実際にテストしてみます。

登録していないIPアドレスからのリクエストでは、以下のように403が返ってきます。

image.png

許可されたIPアドレスからのリクエストは、200OKが返ってきます。

image.png

まとめ

API Managementを使い慣れている人からしたら当たり前のことなのかもしれませんが、個人的に少しハマったのでメモとして残すことにしました。上記関連でもその他でもTips等あったら教えて頂けますと幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?