2011年12月7日水曜日

[AD FS2.0]カスタム属性ストアを作成する


AD FS2.0はその名の通り初期状態では、参加している Active Directory ドメイン上の情報(属性)をクレームとして発行します。

例えば、

c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"]
 => issue(store = "Active Directory", types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"), query = ";userPrincipalName;{0}", param = c.Value);

といった形で要求記述言語を記載すれば Active Directory 上のユーザの userPrincipalName 属性を NameIdentifier タイプのクレームとして発行します。


他にも、AD FS2.0 の属性ストアとして利用できるのは標準で
・LDAP
・SQL Server
があります。

それらの標準で用意されている属性ストアにない情報をクレームとして発行したい、という場合はどうすればよいのか?というと、「カスタム属性ストア」を自分で作って(コーディングして)利用することが出来ます。


ここで少しおさらいですが、 SAML IdP の一般的な構造に従い、AD FS2.0 は以下の様な構造になっています。




























ここで注意なのですが、AD FS2.0 の属性ストアはあくまで属性オーソリティが参照する先のレポジトリである、という点です。つまり、AD FS2.0 の構成要素である認証オーソリティが参照する先はあくまで Active Directory である、という点です。
残念ながら認証オーソリティの参照先を別のシステム(LDAP や他のレポジトリ)に変更することは AD FS2.0 ではできません。(2要素認証などを含むカスタム認証を行う場合は、AD FS2.0 のログインページをカスタマイズすることである程度は対応可能です)

ですから、クレームに含まれる属性を SQL Server や LDAP や今回紹介するテキストファイルから取得することはできますが、これはそれらのシステムで認証を行うわけではなく、認証を行った後に属性を取得することが出来るだけである、ということになります。


前置きが長くなりましたが、早速実装してみます。

細かいところは MSDN の記載を参考にするとして、今回は基礎編として MSDN にサンプルとして記載されているカスタム属性ストアを組み込んでみます。
http://msdn.microsoft.com/en-us/library/ee895358.aspx

紹介されているサンプルはテキストファイルに記載されている属性情報をクレームとして発行する、というものです。


■レポジトリとなるテキストファイルの用意

まずは、元となるテキストファイルを作成します。(C:\temp\data.txtとして保存します)
EmployeeID,EmployeeName,Age,Department,Role
1,John,33,HR,Manager
2,Jane,25,Sales,Vendor
3,Tim,45,Marketing,Evangelist
4,Leann,33,IT,Administrator


■カスタム属性ストア用のライブラリの作成

次に、AD FS2.0 サーバ上に Visual Studio 2010 をインストールし、MSDN のページにあるサンプルコードをコピペして、DLL を作成します。プロジェクトの種類はクラスライブラリを選択します。
# ここで注意なのですが、.NET Framework は3.5を選択する必要があります。.NET Framework 4.0 で作成した DLL だと 3.5 でビルドされている AD FS2.0 から参照できません。 
# Microsoft.IdentityServer.ClaimsPolicy.dll という AD FS2.0 のライブラリを参照する関係で AD FS2.0 がインストールされている環境に Visual Studio をインストールします。(ライブラリをコピーすれば他の環境でもビルドできるとは思いますが、試していません)
# もちろん、WIF SDK もインストールしておく必要があります。

コードは先ほどの MSDN のページのサンプルをそのままコピー&ペーストしますが、その前に参照設定を行う必要があります。
必要なのは、
・Microsoft.IdentityModel
・Microsoft.IdentityServer.ClaimsPolicy
です。



























Microsoft.IdentityServer.ClaimsPolicy については AD FS のインストールフォルダ直下にあるので直接参照します。





























コンパイル出来たら作成した DLL ファイルを「 %Program Files%\Active Directory Federation Services 2.0 」以下にコピーしておきます。


■作成したライブラリを AD FS2.0 のカスタム属性ストアとして登録する

最後は AD FS2.0 に作成したカスタム属性ストアを認識させる作業になります。

まず、AD FS2.0 管理コンソールを起動し、[信頼関係]-[属性ストア]を選択して右クリックして出てくる[カスタム属性ストアの追加]メニューを起動します。





























表示名に「FileAttributeStore」、カスタム属性ストアのクラス名に「CustomAttributeStores.FileAttributeStore,CustomAttributeStores」を設定します。






































次にパラメータを設定します。
今回のサンプルでは
・パラメータ名:FileName
・値:c:\temp\data.txt
と設定します。






















ここまで出来るとカスタム属性ストアを使用する準備が整うので、あとは適当なアプリケーションから利用してみます。


■アプリケーションから利用する

通例に従い、証明書利用者信頼(Relying Party)を作成します。
要求規則ルールにカスタムルールを設定し、以下の様なルールを記載します。
例では、要求規則のルールに age が 45 の人の name と role 属性を取得し、クレームとして発行する、というルールとなっています。











































後は、実際にアプリケーションにアクセスしてみます。
今回のアプリケーションではわたってきたトークンからクレーム・タイプが role の値を取得して表示する、というロジックを記載しているので、以下の様に Evangelist という文字列が表示されます。























詳しくはサンプルで使ったソースを読むとわかるのですが、BeginExecuteQuery メソッドの中で渡されたパラメータに従い、ストアの中から任意の値を返す、というロジックを記載さえできればどんなレポジトリでも属性ストアとして登録することが可能です。

海外には PowerShell の実行結果をクレームとして発行するための PowerShell Attribute Store を作って公開している強者もいたりします。
以下、参考までに。
http://www.theidentityguy.com/articles/2011/11/19/powershell-attribute-store-for-ad-fs-20.html

0 件のコメント: