【IDM】Active Directory の「直属の部下」属性からマネージャーかどうかを判断する 1/2

前回、以下の記事を投稿しました。

【IDM】Active Directory の「直属の部下」属性 - フィールドSEあがりの安納です - Site Home - TechNet Blogs

今回は、AD FS 2.0 のカスタムルールで「直属の部下」属性を取り出してみます。

① 規則テンプレートの選択画面で、「カスタム規則を使用して要求を送信」を選択します

image

② 規則の構成画面で、要求規則名とカスタム規則を入力します

image

カスタム規則になんて書いてあるかというと、以下の通りです。

c:[Type == https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname, Issuer == "AD AUTHORITY"] => issue(store = "Active Directory", types = ("https://schemas.tf.com/Identity/Claims/directReports"), query = ";directReports;{0}", param = c.Value);

作業としては上記の通りです。

簡単に上記のクレーム規則を解説しておきます。

■ c

後ろに続くクレームが格納される変数です。意味が解りませんよね...。あとでわかります。

■ Type == https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname

クレームパイプラインから、windowsaccountname というクレームが渡されたかどうかを判断しています。windowsaccountname に値が入っていない場合にはクレームは渡されませんので、このクレームが存在するということは、事実上「Active Directory」で認証されたことの証拠となります。

ちなみに、windowsaccountname に入っている値はユーザーの msDS-PrincipalName であり、<ドメイン名>\<ユーザー名> の形式です。

■ Issuer == "AD AUTHORITY"

Issuer という綴りから、なんとなく想像つきますよね。そうです。windowsaccountname というクレームを発行したのが「AD AUTHORITY」であることを示しています。

つまり、「c:[Type == https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname,
Issuer == "AD AUTHORITY"] 」の部分全体で、

Active Directory に認証されたユーザーならば

というクレーム発行の条件を表現しています。

■ issue

クレームを発行するためのコマンドです。これ以降に続く文字列が、どんなクレームを発行するかを表現しています。

■ store = "Active Directory"

クレームが格納されている場所が「Active Directory」という名前の場所であることを示しています。勘違いしないでいただきたいのは、これが Active Directory Domain Service を示しているわけではありません。

AD FS 2.0 をインストールすると、規定で「Active Directory」という識別名の要求プロバイダーが登録されるのですが、このことを示しています。とはいえ、実際には Active Directory Domain Service なので、ひとまずあまり気にする必要はありません。

image

■ types = (“https://schemas.tf.com/Identity/Claims/directReports”)

発行するクレームタイプ(クレームの識別名)です。

■ query = ";directReports;{0}"

「Active Directory」ストアに対してクエリーを投げて結果をもらうのですが、その条件式です。見たとおり、directReports という属性を引っ張ってくるうことを示しています。では、誰の directReports 属性を引っ張ってくるのでしょう?

その条件を表現しているのが 「{0}」です。{0}は、msDS-PrincipalName に渡す引数を表しています。でも{0}がそのまま入るわけではありません。これは「0番目のパラメタ」という意味で、実際には下の「param」で指定された文字列が入ります。

■ param = c.Value

param に指定された文字列で Active Directory の msDS-PrincipalName を検索するのですが、その値として c.Value が指定されています。

勘の良い方ならばおわかりですよね。この解説の冒頭に書いた「c」のことです。

ということで、このクレームルールを実行してみると、以下の通り、部下の一覧を取得することができます。

image

さて、ここでハタと気づきます....

「いやいや、部下の一覧をアプリケーションに渡したってアプリ側が面倒になるだけじゃん。
そうじゃなくて、部下がいたら「Manager」というクレームを渡したいのだよ」

はい、おっしゃるとおりです。

次回(以下)は、そんなカスタムクレームを書いてみます。

【IDM】Active Directory の「直属の部下」属性からマネージャーかどうかを判断する 2/2 - フィールドSEあがりの安納です - Site Home - TechNet Blogs