【IDM】テキストファイルを AD FS のカスタム属性ストアとして登録してみる その1

やっとこの話題に触れることができます。なぜ触れなかったかというと、全くテストしていなかったから...すんません。

TechNet に以下の記事が用意されています。この記事では、独自の属性ストア(テキストファイル)を作成して実装する手順が紹介されています。

AD FS 2.0 Attribute Store Overview(英語)

英語ということもあり読むのも面倒ですし、せっかくなのでここでご紹介します。

AD FS の既定の属性ストアは以下の通りです。

  • Active Directory Domain Service
  • Active Directory Lightwaight Directory Service
  • SQL Server

SQL Server を属性ストアとして使用する場合には、以下に示す手順に従って登録する必要があります。

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

では、これ以外の属性ストア(例えばテキストファイルとか Facebook とか)を使用したい場合にはどうしたらよいかといえば、独自のクラスライブラリを作成して、AD FS にカスタム属性ストアとして登録する必要があります。

image

クラスライブラリの仕事は何かというと、AD FS からクエリーを受け取り、指定された属性ストアからデータを検索して AD FSに返してあげる...とうことです。理屈は単純ですね。

image

そうすると、実装すべきものは見えてきます。

  • AD FS のお作法にのっとって、クエリーや結果の受け渡し部分をコーディング
  • カスタム属性ストアにアクセスしてクエリーに合致したデータを検索する
  • クエリーや属性ストアに不備があればエラーとしてAD FSに返してあげる

といった感じです。単純ですね。

今回はテキストファイルをカスタム属性ストアとして使用しますが、作りさえすれば ORACLE だろうが OpenLDAPだろうが Facebook だろうがカスタム属性ストアとして使用することができます。SQL Azure だって問題ありません。なんなら 属性が存在しなければ 利用者に手入力させる...なんて仕組みも作れないわけではありません。

ただ、いずれにしても Active Directory 認証が必須であることには変わりないので注意してください。AD 認証されたことを前提に、AD FS がクラスライブラリを呼び出します。なので、AD の代わりに Oracle Identity Managger を認証プロバイダーとして使用する...ということはできません。これは AD FS の仕様です。

では、そのクラスライブラリはどうやって作るのでしょうか...IT Pro 向けに手順をきっちりご紹介します。

1. カスタム属性ストアの識別名を決めておく

はじめに、属性ストアの識別名を決めます。ここでは、TextFileAttibuteStore としましょう。

2. カスタム属性ストアの仕様を決める

どんな属性ストアかを定義しておかなければコーディングに入れません。

今回は、以下のような CSV ファイルをカスタム属性ストアとして使用することにします。1行目はヘッダーです。ヘッダーが無いと検索が不便なので必ず付けましょう。

EmpId,WindowsID,Age,Dept,Role 1,Akiko,18,HR,Manager 2,junichia,25,UX,Evangelist 3,Shinobu,40,Marketing,Evangelist 4,Akira,43,IT,Admin 5,Kazunori,49,UX,Manager

重要なのはカラムの位置です。クラスライブラリは極力ヘッダー名に依存しないようにコーディングしますが、位置が変わると面倒なので、ここでしっかり決めておきましょう。

3. クエリーの仕様を決める

AD FS が属性ストアを検索するには、専用のクエリ言語を使用してクレームルール(要求規則)を作成する必要があります。AD FS の管理コンソールを使用すると GUI を使ってクレームルールを作成することができますが、カスタム属性ストアを使用する場合には自分でクレームルールを作成する必要があります。

自分で記述したクレームルールを「カスタムルール」と呼んでいます。

カスタムルールについて説明を始めるときりがないので、過去の投稿および資料を参考にしてください。

(参考) カスタムルールについて

今回は、Windows のログオン ID で CSV ファイルを検索し、合致したら Age と Role を返すようにしましょう。これをカスタムルールで記述すると以下のようになります。

c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname"] => issue(store = "TextFileAttributeStore", types = ("https://schemas.tf.com/age", "https://schemas.microsoft.com/ws/2008/06/identity/claims/role"), query = "WindowsID={0};Age,Role", param = c.Value);

カスタムルールに慣れていないと、なんのこっちゃわからないと思いますが、書いてあることは非常に単純です。

1行ずつ見ていきましょう。ちょっと難しいので根気よく読んでください。

c:[Type == " https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname"\]

この行は、次の行にある「issue(発行する)」を実行するための条件文です。Type とはクレームタイプ(要求の種類)のことであり、https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname というクレームが入力方向に存在していれば...という意味になります。クレームタイプは Key-Value-Pair(KVP)の Key に当たるものだと思ってください。

https://~~~~/windowsaccountname は Winodws にログオンしたときのユーザーIDが格納されているクレームタイプです。

ここで「入力方向」の意味が分からない方がいらっしゃるかもしれません。入力方向とは「要求規則」に対する入力のことです。入力方向のクレームを、要求規則によって書き換えたり置換したり、破棄したり、出力方向のクレームが決定されるわけですね。

image

さて、もう1つ意味不明な記述がありますよね。先頭にちゃっかり書かれている「c」です。これは、指定されたクレームタイプをオブジェクトとして格納するための変数だと思ってください。つまり、https://~~/windowsaccountname が格納されています。これはあとで使用します。

ここまでの説明がさっぱり???だという方は、我慢して次に進んでください。すこしずつ見えてくるはずです。ここを乗り越えることが AD FS プロフェッショナルへの第一歩です。

=> issue( ~~~~ )

これはわかりますよね。この前の行の条件が満たされたら「 => 」以降を実行するという意味です。実行するのは issue 、つまり「発行する」ということですね。何を発行するのかは、()カッコ内に書かれています。

store = "TextFileAttributeStore"

発行するクレームが格納されているクレームストアの識別名を指定しています。もしクレームストアが Active Directory ならば「Active Directory」と指定します。1. で TextFileAttibuteStore と決めたことを思い出してください。

types = ("https://schemas.tf.com/age", " https://schemas.microsoft.com/ws/2008/06/identity/claims/role" )

ここで指定している Type もクレームタイプなのですが、今度は出力方向のクレームのタイプです。つまり、発行されるクレームタイプですね。ここでは、2つのクレームタイプを指定しています。agerole ですね。

query = "WindowsID={0};Age,Role", param = c.Value

これがテキストファイルを検索するためのクエリーです。非常に特徴的な記述法ですが、難しくはありません。

WindowsID={0} は Where 句に相当します。つまり、テキストファイル「TextFileAttributeStore」内の WindowsID 列が「{0}」と合致したら...という意味です。{0} には param に指定された0番目の値が入ります。つまり、c.Value です。

もうわかりましたね。c には https://~~/windowsaccountname がオブジェクトとして入っていると書きましたが、その Value 、つまり「値」を意味しています。

もし、administrator というユーザーがログオンしたとすれば、c.Value は administrator になります。

ここまでくれば、Age,Role は言わずもがなです。

windowsaccountname が c.Value に合致した行の Age と Role を結果として返すという意味になります。もちろんその値はクレームタイプに格納します。

Age 列 → https://schemas.tf.com/age
Role  列 → https://schemas.microsoft.com/ws/2008/06/identity/claims/role

もちろん、条件に合致しなかったり、CSVファイルに値が存在しない場合には、クレームタイプの中身は空のままで返されます。

上のCSVファイルを見てください。もし windowsaccountname に junichia が格納されていたら、age=25、role=Evangelist が返されるということになります。

ひとまずここまで。

次回は実際にクラスライブラリを作ります。