2010年1月14日木曜日

ADFS2.0 & WIF on AzureでオンプレミスとクラウドのSSO その2

前回のポストがtwitterで意外と反響がありましたので、取り急ぎ続きを、、ということで今回は「2.オンプレミスのアプリケーションを作成・発行する」をお送りします。


実際の流れは下記の通りです。(今回はWindows7上のIIS7.5をアプリケーションサーバとして利用しています)

1.WIFを使ったClaimベースのWebアプリケーションを作成する
2.STSへのRelying Partyの設定
3.動作確認


では、それぞれのステップについて手順を見ていきます。


1.WIFを使ったClaimベースのWebアプリケーションを作成する
 ADFS2.0を使ったPassiveFederationを行う場合、アプリケーション(Relying Party)はSSLが有効化されている必要があるため、手順書は省略しますがあらかじめローカルのIISでSSLが使える状態にしてく必要があります。(今回、アプリケーションのデプロイ先をDefault Web Siteにしましたので、あらかじめ作成した自己署名入り証明書をhttpsバインドに設定しました)

 では、早速アプリケーションの実装を行います。必要となるのは以下のステップです。
 ・参照設定の追加
 ・STS参照の追加
 ・アプリケーションの実装
 ・アプリケーションの発行

 まずはVisual Studioを管理者として実行します。(STS参照の追加をするためには管理者権限が必要です)




















 次に新しいプロジェクトを以下の通り作成します。

項目備考
プロジェクト名onpremise_pasvfedもちろん任意
プロジェクトの種類Visual C# → Webもちろん言語は任意
テンプレートASP.NET Webアプリケーション



 プロジェクトが起動してきたらソリューションエクスプローラよりWIFへの参照を追加します。追加するコンポーネントはMicrosoft.IdentityModelです。
















 次にSTSへの参照を追加します。
 同じくソリューションエクスプローラからソリューションを右クリックして出てくる「Add STS reference」メニューをクリックします。
 ※Add STS referenceが出てこない場合は管理者としてVisual Studioを実行してみてください。





















 Federation Utilityが起動してきますので、以下の通り値を設定します。
 STS側でも自己署名入りの証明書を使っているので途中証明書チェーンの確認で警告が出ますが続行してください。














ステップ設定項目設定値備考
WelcomeApplication configuration locationプロジェクトのweb.configファイル初期状態で指定されているので変更不要
Application URIhttps://windows7.eidentity.local/onpremise_pasvfed/発行先となるURIを指定
Security Token ServiceSecurity Token Service (STS) optionUse an existing STS既に作成したADFS2.0をSTSとして指定
STS WS-Federation metadata document locationhttps://adfs20.eidentity.local/FederationMetadata/2007-06/FederationMetadata.xmlADFS2.0のMetadataのエンドポイントを指定
STS signing certificate chain validation errorCertificate validation optionDisable certificate chain validationSTSが自己署名入り証明書を使っているため、証明書チェーンの確認を無効化する
Security Token encryptionSecurity Token encryption optionNo encryption



 ユーティリティが終了するとソリューションエクスプローラにFederationMetadata.xmlが追加されているのと、Web.configの内容がSTSを参照する形に変更されます。


















 次はいよいよアプリケーションの実装を行います。
 今回はSTSによって発行されるセキュリティトークンからname属性のClaimを取り出して画面上のラベルに表示する、というアプリケーションを実装します。



















 実装するコードは下記の通りです。Page_load時にトークンからClaimを取り出してClaimTypeがnameならば値を画面上のラベルに表示します。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.IdentityModel.Claims;
using System.Threading;

namespace onpremise_pasvfed
{
  public partial class _Default : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      IClaimsIdentity caller = (IClaimsIdentity)Thread.CurrentPrincipal.Identity;

      foreach (Microsoft.IdentityModel.Claims.Claim c in caller.Claims)
       {
        if (c.ClaimType == Microsoft.IdentityModel.Claims.ClaimTypes.Name)
        {
          lbl_claim_name.Text = c.Value;
           break;
        }
      }

    }
  }
}




 ここまでくると後はアプリケーションの発行だけです。今回はローカルIIS上にアプリケーションを発行しました。
 ここまででアプリケーションの実装・発行は完了です。


2.STSへのRelying Partyの設定
  ・FederationMetadata.xmlの読み込み
  ・Claimのマッピングルールの設定

 今度はSTS側への設定です。基本的にADFS2.0のSTSはレルム指定をしたホワイトリスト型なので、あらかじめ上記で作成したアプリケーションを指定してRelying Partyを定義しておく必要があります。

 ADFS2.0の管理コンソールを開くと、「Required: Add a trusted relying party」というタスクが表示されているので、クリックしてAdd Relying Party Trust Wizardを開始します。



















 Wizardに設定する項目は下記の通りです。


ステップ設定項目設定値備考
Select Data SourceSelect an option that this wizard will use to obtain data about this relying partyImport data about the relying party from a file
Federation metadata file locationアプリケーション側のFederationMetadata.xmlファイル必要であれば予めADFSサーバへプロジェクトディレクトリ以下のFederationMetadata.xmlファイルをコピーしておく
Specify Display NameDisplay Namehttps://windows7.eidentity.local/onpremise_pasvfed/
Choose Issuance Authorization RulesRelying party's issuance authorization rulePermit all users to access this relying party



 Wizardが終わると、Claimマッピングのルールエディタが起動しますので、ルールを追加していきます。


















 Add Ruleボタンをクリックすると、Add Transform Claim Rule Wizardが起動してきますので、下記の通り値を設定します。


ステップ設定項目設定値備考
Choose Rule TypeClaim rule templateSend LDAP Attribute as ClaimsActive Directoryの属性をクレームにマッピングします
Configure Claim RuleClaim rule nameonpremise_pasvfed任意です
Attribute storeActive Directory
LDAP AttributeSAM-Account-Nameペアでマッピングさせます
Outgoing Claim TypeName



 これで一応アプリケーションもSTSも準備が整いましたので、最後に動作確認を行います。

3.動作確認

 早速アプリケーションにアクセスしてみます。ブラウザから「https://windows7.eidentity.local/onpremise_pasvfed/」にアクセスします。











 STSであるadfs20.eidentity.localへリダイレクトされますので、ドメインユーザで認証を受けます。


















 再度リダイレクトされ、アプリケーションが表示され、claim(name)が正しく取得できていることが分かります。


















 今回はオンプレミス環境でWIF/ADFS2.0を使ったClaimベースのWebアプリケーションを実装しましたが、次回はいよいよAzure上で同様のアプリケーションを実行してみます。

0 件のコメント: