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

すっかり7月も半ばを過ぎてしまいました…。TechEd の資料提出の締め切り間近で少々あせりつつ…気分転換に久々の投稿です。

AD FS 2.0 を使用してセキュリティトークンを発行する場合、属性の格納庫として使用できるのは Active Directory だけではありません。以下を属性ストアとして使用することができます。

  • LDAP サーバー
  • SQL Server 2005/2008/2008R2
  • カスタムストア(テキストファイル 等を属性ストアにする場合)
    ただしカスタムストアを使用するには、属性のプロバイダーを独自に作成する必要があります
    https://msdn.microsoft.com/en-us/library/ee895358.aspx

ただ、このあたりの情報が英語しかなく、しかも結構稀薄なんですよね…なので、今回は SQL Server を属性ストアとして使用する手順を以下に示します。

※ このあたりの記事を書かせていただけるメディア様 募集中でございます。
※ 今はニーズが少ないかもしれませんが、1年後のビュー拡大は確実です

【Step 1】準備

  • SQL Server 上にデータベースとテーブルを用意する。
  • AD FS 2.0 サービス(adfssvc)の実行アカウントに対して、データベースへの ReadReader 権限を与えておきます。これをしないと、SQL Server への接続時にアクセス拒否エラーとなり、イベントログに イベントID 376 が報告されます。
    image

【Step 2】属性ストア として SQL Server の登録

AD FS 2.0 の管理コンソールから、[信頼関係] - [属性ストア] - [属性ストアの追加] を選択します。
image

[属性ストアの種類] として 「SQL」を選択し、SQL Server への接続文字列を入力します。今回は、以下のように入力しました。以下のように Integrated Security を True にした場合には、【Step 1】での、サービスアカウントに対するデータベースへのアクセス権を確実に付与したことを再度確認しておいてください。

Server=t330401 ; Database=AttrStore ; Integrated Security = True

image

「表示名」は属性ストアを識別するために、Step 3 で使用するので、覚えておいてください。

なお、ここで接続文字列が間違えていてもエラーが出ません…。実際に動かしてみて問題がある場合には、イベントログに以下のようなエラー(イベントID 376)が出力されます。

image
[イベントビューアー] - [アプリケーションとサービスログ] -  [AD FS 2.0] - [Admin]

【Step 3】要求規則の追加

本来ならば、要求規則や要求記述について詳細に解説したいのですが、今回はおいときます。

AD FS 2.0 の管理コンソールから [信頼関係] - [証明書利用者信頼] を選択し、要求規則を追加する RP(Rerying Party:証明書利用者) を右クリックしてください。

[要求規則の編集] を選択します。

image

[発行変換規則] タブで、[規則の追加] をクリックします。
image

変換要求規則の追加ウィザードが起動するので、最初の画面で 「カスタム規則を使用して要求を送信」を選択します。

image

次の画面で規則を入力します。ここでは、以下のように入力しました。

image

=> issue(store = "AttributeStore_SQLServer", types = (" https://schemas.t3304.com/postalcode") , query = "select PostalCode from Attributes where userid='T3304\Administrator'");

さて、問題は、コレが何を意味しているか?ということですよね。

詳細な解説は後日行いますが、まずは試していただきたい!ということで、簡単に書きます。

  • =>
    この文字列から予測できるように、実は、=> の前には「クレームを発行する」条件を記述することができます。今回は条件を省略したので、「無条件でクレームが発行される」ことになります。
  • issue ( );
    この部分はクレームを発行するときに使用する記述です。() 内に取得する属性を記載します
  • store = "AttributeStore_SQLServer"
    Step2 で作成したSQL Server の属性ストア名です。
  • types = (" https://schemas.t3304.com/postalcode")
    クレームタイプ(要求の種類)と呼ばれるもので、属性が格納されるクレームを指定します。…とかくと難しく感じますが、管理コンソールの [サービス] - [要求記述] の一覧に表示されているクレームタイプの中から、適切なものを選択して指定します。
    とはいえ、何が適切かわからない..もしくは適切な入れ物(クレームタイプ)が無い…場合が多いですよね。その場合には、自分で作っちゃってください。
    以下の画面で、一番下に「郵便番号」とありますが、これは私が勝手に作ったクレームタイプです。https:// の後に指定する URI は、世界で一意になるようにします。通常は、自分のドメイン名等を使用します。
    image 
    ちなみに、上の画面の「名前」の部分は、単なる 管理画面上の識別名であり、プログラム等から使用することはできません。あくまでもクレームの識別は、「クレームタイプ」で行われるのだということを覚えておいてください。
  • query = "select PostalCode from Attributes where userid='T3304\Administrator'")
    これはわかりますよね。SQL Server に対するクエリーです。この結果が、Types で指定したクレームに格納されます。

いかがでしょう?なんとなく見えてきましたか?

おそらく、多くの方が煮え切らない感じかなぁと思います。お気持ちはよくわかります。カスタム規則の記述方法は奥が深いので、追ってきちんと解説します(できれば TechEd 2010 にもいらしてくださいませ)。