まずは手始め、ということで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://
の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 Store | Enterprise Active Directory User Account Store(Geneva Serverが所属するドメインのAD DS) | |
Claimマッピング | LDAP | Outgoing Claim Type |
sAMAccountName | Name | |
E-Mail Address | ||
givenName | Given Name | |
sn | Surname |
設定したら保存してエディタを終了します。
■動作確認(STSに定義したClaimをキチンと取得できるかどうか)
ここまで来たらあとは動作テストです。以下の手順でうまく動くかを試してみます。
・ブラウザで作成/発行したテストアプリケーションサイトへアクセス
https://localhost/WebApplication3/
・STSへリダイレクトされるのでサインイン
認証方法としてWindows統合認証、証明書、IDとパスワードから選択出来るのでWindows統合認証を選択(もちろんIDとパスワードを入れてもOK)
・STSで認証され、元のサイトへリダイレクト
STSから渡ってきたクレーム情報(ADDSの属性)が表示されればOKです。
余談ですが、実際のアクセスの流れstraceでトレースしてhttpreplayで表示みると以下の通りです(細かい内容は機会があれば解説したいと思います)
ID | Method | Requested URL | Status |
1 | GET | http://localhost/WebApplication3/default.aspx | 302 |
2 | GET | http://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%3a46Z | 200 |
3 | POST | http://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%3a46Z | 200 |
4 | POST | http://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%3a46Z | 200 |
5 | POST | http://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%3a46Z | 302 |
6 | GET | http://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%3a46Z | 401 |
7 | GET | http://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%3a46Z | 401 |
8 | GET | http://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%3a46Z | 200 |
9 | POST | http://localhost/WebApplication3/ | 302 |
10 | GET | http://localhost/WebApplication3/default.aspx | 200 |