※本記事は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アドレスを一つの変数として管理したい場合には、以下のようにカンマ区切りで登録をすることができます。
ポリシーに対してのハードコードでもこのカンマ区切りは作用しますが、今回は名前付きの値として登録をしました。
ポリシーからの呼び出し
名前付きの値が設定出来たら、ポリシーから値を呼び出します。サンプルコードを以下に示します。
<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が返ってきます。
許可されたIPアドレスからのリクエストは、200OKが返ってきます。
まとめ
API Managementを使い慣れている人からしたら当たり前のことなのかもしれませんが、個人的に少しハマったのでメモとして残すことにしました。上記関連でもその他でもTips等あったら教えて頂けますと幸いです。


