ADFS2.0 を使用する クレーム対応 ASP.NET Web フォーム アプリケーションを作成する手順を覚書として記載します。今回は Visual Studio からデバッグも含めて ADFS2.0 をSTS として使用するアプリケーションを簡単に作成する手順を記載することを目的としていますが、クレームベース認証を行うための構成ファイルの編集は WIF SDK に付属する FedUtil.exe ツールを使用して 構成ファイルを編集するので ADFS2.0 以外のプロダクトやカスタムSTS でも動作するクレーム対応のアプリケーションを作成できます。
検証環境は次の通りです
- IIS と同じマシン上に Visual Studio 2010 をインストール済み
- IISでhttps用のサイトと証明は設定済み(httpsの設定方法はWeb上のページや[Dynamics CRM 2011]IFD展開を構成する その1 HTTPSバインディングとDNSの設定を参照)
- Web アプリケーションのアプリケーションプールは .NET 4.0 の 統合モードで動作.
- WIF SDK, WIF Runtime はインストール済み
- ADFS2.0 は構築済み ([Dynamics CRM 2011]IFD展開を構成する その2 ADFS2.0のインストールと構成 で使用したADFS2.0 を使用しています。)
Dynamics CRM 2011 で IFD 構成を実装するときに使用した ADFS2.0 を使用していますので、カスタム Web アプリで https に使用する証明書と ADFS2.0 でクレームの署名に使用する証明はお互いのマシン上の証明書ストアにセットアップ済みの環境となっています。
1. クレーム認証を使用する ASP.NET Web フォームアプリケーションの作成
今回は、 Visual Studio のプロジェクトから IIS に Web アプリケーションを作成してみます。なので、 Visual Studio を 管理者として実行してください。(Visual Studio からWebアプリケーションをIISに作りたくない場合は IISマネージャーからWebアプリケーションを作成しておいてください。)
メニューのプロジェクト → 新規作成 を選択してください。 新しいプロジェクト用のダイアログが表示されます。テンプレートにASP.NET 空の Web アプリケーションを選択し、適当な名前でプロジェクトを作成します。今回の例では ClaimWeb01 という名前で作成します。
プロジェクトにdll参照を追加します。参照の追加ダイアログで .NET タブ をクリックし、 Microsoft.IdentityModel を選択します。OKボタンをクリックします。
次に クレーム認証後に表示する ASPX ページを作成します。本例では Default.aspx という名前で Web フォームを作成します。
作成した Default.aspx.cs を次のように編集します。lblName, lblUpn, lblRole は Default.aspx 上に配置した Label コントロールです。画面に単純に配置しただけなのでソースは割愛します。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace ClaimWeb01 { using Microsoft.IdentityModel.Claims; public partial class Default : System.Web.UI.Page { /// <summary> /// ユーザーのアカウント,UPN,セキュリティグループを列挙する /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Page_Load(object sender, EventArgs e) { IClaimsPrincipal principal = System.Threading.Thread.CurrentPrincipal as IClaimsPrincipal; if (principal != null) { IClaimsIdentity identity = principal.Identity as IClaimsIdentity; // Name lblName.Text = identity.Name; // Upn lblUpn.Text = identity.Claims.Where(x => x.ClaimType == ClaimTypes.Upn).Select(x => x.Value).FirstOrDefault(); // Role var roles = identity.Claims.FindAll(x => x.ClaimType == identity.RoleClaimType).Select(x => x.Value).ToList(); lblRole.Text = string.Join(",", roles.ToArray()); } } } }
Visual Studioの開発サーバーは https が使用できないので、 IIS 上に Webアプリケーションを作成し、デバッグ実行時にIISを使用するように Webアプリケーションの設定を変更します。ソリューションエクスプローラー上で作成したプロジェクトを右クリック→プロパティを選択します。
プロパティ画面が表示されるので Web タブをクリックします。サーバーセクションで" IIS Web サーバーの使用"を選択します(既定では"Visual Studio 開発サーバーを使用する"になっています)。プロジェクトのURLにIISで使用するWebアプリケーションのURLを入力します。入力後 仮想ディレクトリの作成 ボタンをクリックしてください。 IIS 上に Web アプリケーションが作成されます。下例では カスタムのポート番号(444)を使用するように IISの設定を行っているため、httpsで使用するポート番号に 444 が指定されています。Webアプリケーション名はプロジェクト名と同じ ClaimWeb01 としています。
仮想ディレクトリの作成が成功すると下図ダイアログが表示されます。仮想ディレクトリの作成が失敗する場合は、 Visual Studio を管理者として起動ていることと、入力した URL が正しいURLであることを確認してください。
Visual Studioのプロジェクトのプロパティ画面で仮想ディレクトリを作成しない場合は IISマネージャー上でWebアプリケーションを作成し、アプリケーションのフォルダがプロジェクトのフォルダとなるように手動で設定しておいてください。
ここまではWindows 認証を使用する通常のアプリケーションです。クレームベース認証を使用するようにします。
下図のように プロジェクトを右クリック→ Add STS reference を選択します。
Federation Utility が起動します。
メニューのツール→ Add STS reference や Run Federation Utility Tool から FedUtil.exe を起動することも可能です。.NET 4.0用のWIF SDK をインストールした場合、FedUtil.exe は既定では 次のフォルダにインストールされています。
%SystemDrive%\Program Files (x86)\Windows Identity Foundation SDK\v4.0\FedUtil.exe
Application configuration location が Web アプリケーションのルートの web.config となっていることを確認します。 Application URI に IISにセットアップした クレーム対応WebアプリケーションのURIを入力します。このURIは 先ほど Webアプリケーションのプロパティ画面のWebタブで設定した IISの URI と同じになります。 Next ボタンをクリックしてください。
Security Token Service 画面が表示されます。 ADFS2.0を使用するので、Use an existing STS を選択します。 STS のパスに ADFS2.0 をセットアップした STS のURI を設定します。本例では[Dynamics CRM 2011]IFD展開を構成する その2 ADFS2.0のインストールと構成 で作成した ADFS2.0を再利用しているので、 https://sts.dcrm.local と入力しています。Nextボタンをクリックします。
セキュリティートークンを暗号化するかを選択するページが表示されます。今回は暗号化しません。 No encryption のまま Next ボタンをクリックします。
ADFS2.0 (STS) から提供される クレームの一覧が表示されます。 Next ボタンをクリックします。
Summary 画面が表示されます。 内容を確認して、 Finish ボタンをクリックします。
Trust managemet の Schedule a task to perform daily WS-Federation metadata updates にチェックをするとタスクスケジューラーに日次で 構成ファイルを更新する タスクが作成されます。
web.config と FederationMetadata.xml の作成(or 更新) が成功すると、下図ダイアログが表示されます。
下図のようのプロジェクトに FederationMetadata/2007-06/FederationMetadata.xml というファイルが作成されます。
Add STS reference ウィザードでは、 name と role をクレームとして STSに要求するようにFederationMetadata.xml が構成されます。
<claimTypeRequired> <!--Following are the claims offered by STS 'http://sts.dcrm.local/adfs/services/trust'. Add or uncomment claims that you require by your application and then update the federation metadata of this application.--> <claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" optional="true" /> <claimType type="http://schemas.microsoft.com/ws/2008/06/identity/claims/role" optional="true" /> <!--<claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress" optional="true" />--> <!--<claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname" optional="true" />--> <!--<claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn" optional="true" />--> <!--<claimType type="http://schemas.xmlsoap.org/claims/CommonName" optional="true" />--> <!--<claimType type="http://schemas.xmlsoap.org/claims/EmailAddress" optional="true" />--> <!--<claimType type="http://schemas.xmlsoap.org/claims/Group" optional="true" />--> <!--<claimType type="http://schemas.xmlsoap.org/claims/UPN" optional="true" />--> <!--<claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname" optional="true" />--> <!--<claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/privatepersonalidentifier" optional="true" />--> <!--<claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier" optional="true" />--> <!--<claimType type="http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationinstant" optional="true" />--> <!--<claimType type="http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationmethod" optional="true" />--> <!--<claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/denyonlysid" optional="true" />--> <!--<claimType type="http://schemas.microsoft.com/ws/2008/06/identity/claims/denyonlyprimarysid" optional="true" />--> <!--<claimType type="http://schemas.microsoft.com/ws/2008/06/identity/claims/denyonlyprimarygroupsid" optional="true" />--> <!--<claimType type="http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid" optional="true" />--> <!--<claimType type="http://schemas.microsoft.com/ws/2008/06/identity/claims/primarygroupsid" optional="true" />--> <!--<claimType type="http://schemas.microsoft.com/ws/2008/06/identity/claims/primarysid" optional="true" />--> <!--<claimType type="http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname" optional="true" />--> </claimTypeRequired>
今回は 名前(name) と 役割(role) に加えて ユーザープリンシパル(UPN) を要求するように 変更してみます。web.config の http://../2005/05/../upn 要素のコメントを解除し、http://2005/05/../name, http://../2008/06/../role および、 http://../2005/05/../upn の optional を false に変更して web.config を保存します。
%FEDUTILPATH%\FedUtil.exe /u Web.config
再度 リビルドして、エラーが発生しないことを確認します。
以上でアプリ側の作成は完了です。(実際には 後程、クレーム認証結果の POST 処理の場合 検証エラーとしないようにするカスタムの検証リクエストSampleRequestValidator.cs を作成します。
続いて [WIF] ADfS2.0 を使用する クレーム対応 Web アプリケーションを作成する その2 でADFS2.0 側で 証明書利用者の設定を行います。
さんのコメント: さんのコメント: