【IDM】Active Directory の「直属の部下」属性からマネージャーかどうかを判断する 1/2
前回、以下の記事を投稿しました。
【IDM】Active Directory の「直属の部下」属性 - フィールドSEあがりの安納です - Site Home - TechNet Blogs
今回は、AD FS 2.0 のカスタムルールで「直属の部下」属性を取り出してみます。
① 規則テンプレートの選択画面で、「カスタム規則を使用して要求を送信」を選択します
② 規則の構成画面で、要求規則名とカスタム規則を入力します
カスタム規則になんて書いてあるかというと、以下の通りです。
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 なので、ひとまずあまり気にする必要はありません。
■ 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」のことです。
ということで、このクレームルールを実行してみると、以下の通り、部下の一覧を取得することができます。
さて、ここでハタと気づきます....
「いやいや、部下の一覧をアプリケーションに渡したってアプリ側が面倒になるだけじゃん。
そうじゃなくて、部下がいたら「Manager」というクレームを渡したいのだよ」
はい、おっしゃるとおりです。
次回(以下)は、そんなカスタムクレームを書いてみます。
【IDM】Active Directory の「直属の部下」属性からマネージャーかどうかを判断する 2/2 - フィールドSEあがりの安納です - Site Home - TechNet Blogs