AD FS 2.0 カスタムルール(カスタム規則)の作り方という記事が公開されています。(2010/09/12)
http://blogs.technet.com/b/junichia/archive/2010/09/13/3354952.aspx
以下、上記URLから本文を引用して紹介します。
9/11 は MVP 瀬尾さん主催の「技術ひろば」で AD FS 2.0 のお話をさせていただきました。本日の資料を以下にアップロードしましたので参考になさってください。ちなみに10月の勉強会は エバンジェリスト松崎による SharePoint 開発 らしいです。お好きな方にはたまらないかと。
さて、私のセッションの中で カスタムルール を使用したデモンストレーションを行いましたが、その作成手順を説明できなかったのでこちらにまとめておきます。カスタムルールについては以下も参考にしてください。
■想定するシナリオ
Active Directory にログオンした回数 (LogonCount) によって利用者の利用状況を判断し、WEB アプリケーションに表示するメニューを変えたい。例えば、100 回以上ログオンしたことがあるユーザーは「操作に慣れたユーザー」であると判断して、使えるアプリケーションを増やしてあげるとか…。(適当なシナリオですんません)
■作業概要と若干の事前解説
AD FS 2.0 ではクレームを作成しやすくするため、以下に示すような「要求規則テンプレート」というものが用意されています。
このテンプレートで吸収できない規則(ルール)を使用したい場合には、「カスタムルール」を作成しなければなりません。
カスタムルールの書式は一見シンプルなのですが、実は意外と奥が深かったりします。書式に関する情報や事例が、現時点ではあまり多くなく、ちょいと苦労するかもしれません。
カスタムルールを作成するのにうってつけの参考書は、既存の要求規則テンプレートでしょう。例えば、「入力方向の要求をパススルーまたはフィルター処理」という要求規則テンプレートを使用して、
『役割』というクレームに『Manager』が入っている場合のみクレームをスルーする
という規則を作ってみると、以下のようになります。
ここで、画面の下部にある「規則言語の表示」をクリックしてください。画面の設定内容が「要求規則言語」で表示されます。
言語部分は、以下のように書かれています。
c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/role", Value =~ "^(?i)Manager$"]
=> issue(claim = c);要求規則言語は大きく2つの部分に分かれます。1つが条件部で、もう1つが発行部です。両者は「=>」で結ばれ、条件部が True の場合にのみ処理が発行部に渡されてクレームが発行されます。
今回の例では、以下のように条件部と発行部が記述されています。
条件部 c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/role", Value =~ "^(?i)Manager$"]
発行部 issue(claim = c);条件部に何が書かれているか、勘の良い方ならばおわかりですよね。「Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/role"」が評価対象となるクレームタイプです。クレームタイプとは「クレームの識別名」だと思っていただければ結構です。AD FS 2.0 管理コンソールの [サービス] - [要求記述] でクレームタイプ(要求の種類)の一覧を確認することができます(必要に応じて追加することもできます)。ちなみに、以下の画面で「ログオン回数」や「名前」というのは、この「管理コンソール内での識別名」なので注意してください。クレームは企業間やクラウド間でやり取りをすることを想定しており、システムが混乱しないように「世界で一意」でなければなりません。そのために URI での表現が採用されています。
「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 なんて属性は、マニアックすぎて既定では用意されていません。
また、Active Directory から取ってきた属性は、クレームに格納しないとはじまりません。しかし格納先の箱となるクレームが都合よく用意されているとは限りません。上のほうで「要求記述」の話をしましたが、要求記述としてリストされていないクレームタイプは、AD FS 2.0 で使用することができないので、自分で定義してあげる必要があります。
今回のように「ログオン回数」を格納するためのクレームなんてのは、当然用意されていないので、独自に定義する必要があります。ちなみに、既定では以下のクレームタイプが用意されています。この作業が「面倒でいや!」な場合には、あらかじめ用意されているクレームタイプに放り込んでしまっても動作上の支障はありません。が…アプリケーションがクレームを受け取るときに混乱するのでお勧めできません。だって、「ログオン回数」が「Name」に入っていたら気持ち悪いですよね。なので、必要に応じて混乱が生じないクレームタイプを定義するようにしましょう。
ということで、次回は上記のシナリオを実装するための手順について書きます。