2009年7月31日金曜日

Geneva ServerのSTSとしての動作を確認

なかなか時間がとれずに手をつけられなかったGeneva(Active Directory Federation Services)ですが、ようやく触り始めました。
まずは手始め、ということでGeneva ServerのSTS(Security Token Service)の動作確認も兼ねて、STSを使うWebアプリケーションをGeneva Framework(Windows Identity Framework)を使って作ってみました。

動作のイメージはこんな感じです。













作業の流れとしては、
・Geneva Framework / Geneva Framework SDKのインストール
・Claimを使うWebアプリケーションの作成
・作成したアプリケーションが別途構築したGeneva ServerのSTSを使うように設定
・作成したアプリケーションをGeneva ServerにRelying Partyとして登録
・動作確認(STSに定義したClaimをキチンと取得できるかどうか)
となります。

早速順番に見ていきます。

■Geneva Framework / Geneva Framework SDKのインストール

まず今回用意した環境は下記の通りです。
・Windows Server 2008 EE 64bit(1台のサーバにADDS以外は入れました)
・Geneva Framework
・Geneva Framework SDK
・Visual Studio 2008 STD(.NET Framework 3.5SP1)


■Claimを使うWebアプリケーションの作成

アプリケーションの作成は下記の手順で行います。

1.Visual Studioを起動し、Webアプリケーションの新規作成













2.ソリューションエクスプローラからGeneva Frameworkのライブラリへの参照を設定します。
  対象は
  ・Microsoft.IdentityModel
  ・System.IdentityModel
  の2つです。






















3.Webページを作成します。
  取得したTokenからClaimを取り出してテーブルに内容を表示することにします。

















4.コードの作成
  Page_Loadイベントの中で取得したTokenからClaimを取り出します。

  IClaimIdentity型の変数callerを定義し、コンカレントセッションのセキュリティプリンシパル情報=取得したTokenをセットします。

  (実際のコード)
  IClaimsIdentity caller = (IClaimsPrincipal)(Thread.CurrentPrincipal)).Identities[0];

  次に、callerのメンバであるClaimsプロパティに入っているそれぞれのClaim(属性)をLINQを使って取り出して行きます。
  たとえば、ClaimTypeがNameの属性を取得したければ、caller.ClaimsからSystem.IdentityModel.Claims.ClaimType.Nameと合致するClaimを抜き出します。

  (実際のコード)
  string Name = (from c in caller.Claims where c.ClaimType == System.IdentityModel.Claims.ClaimType.Name select c.Value).Single();














■作成したアプリケーションが別途構築したGeneva ServerのSTSを使うように設定

具体的にはユーティリティを使ってアプリケーションのweb.configを設定します。

ドキュメントを見ているとソリューションエクスプローラで右クリックするとSTSの設定ができるようなことが書いてありますが、実際には出てこなかったのでGeneva Frameworkのインストールフォルダ以下のFedUtil.exeを直接実行します。
 やることは、
 ・作成したアプリケーションのWeb.configを指定
 ・STSとしてGeneva Serverのmetadataを指定
  ※https:///FederationMetadata/2007-06/FederationMetadata.xml
 の2点です。

















この後、アプリケーションをビルドして発行~IISへの登録をして、使えるようにします。


■作成したアプリケーションをGeneva ServerにRelying Partyとして登録

今度はSTS側の設定ですのでGeneva Serverの管理コンソールから作業をします。

Geneva Serverの管理コンソール















以下の手順でRPを登録します。
1.Policy → Replying Partiesを選択し、操作パネルから「Add Relying Party」をクリックする















2.ウィザードに従いRPの登録を行います
  すでにアプリケーション側は作成~設定済みなのでSelect Data Source画面では「Import relying party configuration from a local federation metadata file」を選択し作成したアプリケーションプロジェクトフォルダ配下にあるmetadataのxmlファイルを選択すてRP情報を登録します。




















3.Claimのマッピングルールを作成
  ウィザードが終了するとClaimルールエディタが起動するので、以下の通りマッピングなどを設定します。

項目設定
ルールタイプLDAP
Attribute StoreEnterprise Active Directory User Account Store(Geneva Serverが所属するドメインのAD DS)
ClaimマッピングLDAPOutgoing Claim Type
sAMAccountNameName
mailE-Mail Address
givenNameGiven Name
snSurname


  設定したら保存してエディタを終了します。

















■動作確認(STSに定義したClaimをキチンと取得できるかどうか)

ここまで来たらあとは動作テストです。以下の手順でうまく動くかを試してみます。

・ブラウザで作成/発行したテストアプリケーションサイトへアクセス
 https://localhost/WebApplication3/










・STSへリダイレクトされるのでサインイン
 認証方法としてWindows統合認証、証明書、IDとパスワードから選択出来るのでWindows統合認証を選択(もちろんIDとパスワードを入れてもOK)













・STSで認証され、元のサイトへリダイレクト
 STSから渡ってきたクレーム情報(ADDSの属性)が表示されればOKです。



















余談ですが、実際のアクセスの流れstraceでトレースしてhttpreplayで表示みると以下の通りです(細かい内容は機会があれば解説したいと思います)

IDMethodRequested URLStatus
1GEThttp://localhost/WebApplication3/default.aspx302
2GEThttp://localhost/FederationPassive/?wa=wsignin1.0&wtrealm=https%3a%2f%2flocalhost%2fWebApplication3%2f&wctx=rm%3d0%26id%3dpassive%26ru%3d%252fWebApplication3%252fdefault.aspx&wct=2009-07-30T08%3a47%3a46Z200
3POSThttp://localhost/FederationPassive/IPSelection.aspx?wa=wsignin1.0&wtrealm=https%3a%2f%2flocalhost%2fWebApplication3%2f&wctx=rm%3d0%26id%3dpassive%26ru%3d%252fWebApplication3%252fdefault.aspx&wct=2009-07-30T08%3a47%3a46Z200
4POSThttp://localhost/FederationPassive/IPSelection.aspx?wa=wsignin1.0&wtrealm=https%3a%2f%2flocalhost%2fWebApplication3%2f&wctx=rm%3d0%26id%3dpassive%26ru%3d%252fWebApplication3%252fdefault.aspx&wct=2009-07-30T08%3a47%3a46Z200
5POSThttp://localhost/FederationPassive/SignIn.aspx?wa=wsignin1.0&wtrealm=https%3a%2f%2flocalhost%2fWebApplication3%2f&wctx=rm%3d0%26id%3dpassive%26ru%3d%252fWebApplication3%252fdefault.aspx&wct=2009-07-30T08%3a47%3a46Z302
6GEThttp://localhost/FederationPassive/auth/integrated/IntegratedSignIn.aspx?wa=wsignin1.0&wtrealm=https%3a%2f%2flocalhost%2fWebApplication3%2f&wctx=rm%3d0%26id%3dpassive%26ru%3d%252fWebApplication3%252fdefault.aspx&wct=2009-07-30T08%3a47%3a46Z401
7GEThttp://localhost/FederationPassive/auth/integrated/IntegratedSignIn.aspx?wa=wsignin1.0&wtrealm=https%3a%2f%2flocalhost%2fWebApplication3%2f&wctx=rm%3d0%26id%3dpassive%26ru%3d%252fWebApplication3%252fdefault.aspx&wct=2009-07-30T08%3a47%3a46Z401
8GEThttp://localhost/FederationPassive/auth/integrated/IntegratedSignIn.aspx?wa=wsignin1.0&wtrealm=https%3a%2f%2flocalhost%2fWebApplication3%2f&wctx=rm%3d0%26id%3dpassive%26ru%3d%252fWebApplication3%252fdefault.aspx&wct=2009-07-30T08%3a47%3a46Z200
9POSThttp://localhost/WebApplication3/302
10GEThttp://localhost/WebApplication3/default.aspx200

0 件のコメント: