【IDM】AD FS 2.0 カスタムルール(カスタム規則)の作り方 1/2

9/11 は MVP 瀬尾さん主催の「技術ひろば」で AD FS 2.0 のお話をさせていただきました。本日の資料を以下にアップロードしましたので参考になさってください。ちなみに10月の勉強会は エバンジェリスト松崎による SharePoint 開発 らしいです。お好きな方にはたまらないかと。

CloudDeAD 

さて、私のセッションの中で カスタムルール を使用したデモンストレーションを行いましたが、その作成手順を説明できなかったのでこちらにまとめておきます。カスタムルールについては以下も参考にしてください。

【IDM】AD FS 2.0 で属性ストアとしてSQL Server を使用する

■想定するシナリオ

Active Directory にログオンした回数 (LogonCount) によって利用者の利用状況を判断し、WEB アプリケーションに表示するメニューを変えたい。例えば、100 回以上ログオンしたことがあるユーザーは「操作に慣れたユーザー」であると判断して、使えるアプリケーションを増やしてあげるとか…。(適当なシナリオですんません)

■作業概要と若干の事前解説

AD FS 2.0 ではクレームを作成しやすくするため、以下に示すような「要求規則テンプレート」というものが用意されています。

image

このテンプレートで吸収できない規則(ルール)を使用したい場合には、「カスタムルール」を作成しなければなりません。

カスタムルールの書式は一見シンプルなのですが、実は意外と奥が深かったりします。書式に関する情報や事例が、現時点ではあまり多くなく、ちょいと苦労するかもしれません。

カスタムルールを作成するのにうってつけの参考書は、既存の要求規則テンプレートでしょう。例えば、「入力方向の要求をパススルーまたはフィルター処理」という要求規則テンプレートを使用して、

『役割』というクレームに『Manager』が入っている場合のみクレームをスルーする

という規則を作ってみると、以下のようになります。

image

ここで、画面の下部にある「規則言語の表示」をクリックしてください。画面の設定内容が「要求規則言語」で表示されます。

image

言語部分は、以下のように書かれています。

c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/role", Value =~ "^(?i)Manager$"] => issue(claim = c);

要求規則言語は大きく2つの部分に分かれます。1つが条件部で、もう1つが発行部です。両者は「=>」で結ばれ、条件部が True の場合にのみ処理が発行部に渡されてクレームが発行されます。

image

今回の例では、以下のように条件部と発行部が記述されています。

条件部  c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/role", Value =~ "^(?i)Manager$"]
発行部  issue(claim = c);

条件部に何が書かれているか、勘の良い方ならばおわかりですよね。「Type == " https://schemas.microsoft.com/ws/2008/06/identity/claims/role " 」が評価対象となるクレームタイプです。クレームタイプとは「クレームの識別名」だと思っていただければ結構です。AD FS 2.0 管理コンソールの [サービス] - [要求記述] でクレームタイプ(要求の種類)の一覧を確認することができます(必要に応じて追加することもできます)。ちなみに、以下の画面で「ログオン回数」や「名前」というのは、この「管理コンソール内での識別名」なので注意してください。クレームは企業間やクラウド間でやり取りをすることを想定しており、システムが混乱しないように「世界で一意」でなければなりません。そのために URI での表現が採用されています。

image

Value =~ "^(?i)Manager$" 」は「 =~ 」からもわかるとおり、正規表現を使用しています。「Type として指定したクレームに格納されている値が、この正規表現に合致するならば…」という意味になります。ちなみに「"^(?i)Manager$」は、「大文字と小文字を問わず”Manager”という文字にピッタリ合致する」という意味になります。「MANAGER」「manager」「mAnaGer」などが合致しますが、「Senior Manager」や「Manager Role」は合致しません。

先ほど、「要求規則テンプレート」で表現できない場合にはカスタムルールを作成する..と書きましたが、もう1つ、カスタムルールを作成しないと吸収できない場合があります。それは、AD FS 2.0 の管理コンソールにあらかじめ用意されていない「属性」をクレームに放り込みたい場合です。

AD FS 2.0 では、Active Directory から取ってこられる属性が既定されています(以下の図を参照)。つまり、これ以外の属性についてはカスタムルールを定義して独自に取ってこなくてはなりません。もちろん、今回のシナリオで想定している LogonCount なんて属性は、マニアックすぎて既定では用意されていません。

image

また、Active Directory から取ってきた属性は、クレームに格納しないとはじまりません。しかし格納先の箱となるクレームが都合よく用意されているとは限りません。上のほうで「要求記述」の話をしましたが、要求記述としてリストされていないクレームタイプは、AD FS 2.0 で使用することができないので、自分で定義してあげる必要があります。

今回のように「ログオン回数」を格納するためのクレームなんてのは、当然用意されていないので、独自に定義する必要があります。ちなみに、既定では以下のクレームタイプが用意されています。この作業が「面倒でいや!」な場合には、あらかじめ用意されているクレームタイプに放り込んでしまっても動作上の支障はありません。が…アプリケーションがクレームを受け取るときに混乱するのでお勧めできません。だって、「ログオン回数」が「Name」に入っていたら気持ち悪いですよね。なので、必要に応じて混乱が生じないクレームタイプを定義するようにしましょう。

image 

ということで、次回は上記のシナリオを実装するための手順について書きます。

つづき