ADFS2.0 を使用する クレーム対応 ASP.NET Web フォーム アプリケーションを作成する手順を覚書として記載します。今回は Visual Studio からデバッグも含めて ADFS2.0 をSTS として使用するアプリケーションを簡単に作成する手順を記載することを目的としていますが、クレームベース認証を行うための構成ファイルの編集は WIF SDK に付属する FedUtil.exe ツールを使用して 構成ファイルを編集するので ADFS2.0 以外のプロダクトやカスタムSTS でも動作するクレーム対応のアプリケーションを作成できます。

検証環境は次の通りです

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 が構成されます。

 

web.config を確認すると、 claimTypeRequired 要素内に要求するクレームの種類が設定されています。name と role が optional = true で作成されます。その他のクレームはコメントになっています。
        <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 を保存します。

変更した内容でFederationMetadata.xml を再作成します。FedUtil を使用した ASP.NET 証明書利用者アプリケーションから STS への信頼の確立の"3. フェデレーション メタデータの更新"によると、ソリューションエクスプローラーからプロジェクトを右クリック→フェデレーション メタデータの更新 でメタデータを更新できるはずなのですが、コンテキストメニューに項目が表示されませんでした(クレーム対応のASP.NET Webサイトテンプレートから作成した Webサイトプロジェクトである必要があるのかもしれません)。
 
そのため、コマンドプロンプトでFedUtil.exe を /u オプションを指定してWeb.config の内容で FederationMetadata.xml を更新するようにします。コマンドは次のように実行します。実行例を記載します。例ではコマンドプロンプトのカレントフォルダがWebアプリケーションプロジェクトと同じであることを想定しています。%FEDUTILPATH% は FedUtil.exe がインストールされたパスです。 Web.config は FederationMetadata.xml を更新するために使用する アプリケーション構成ファイルです。詳しくは FedUtil.exe (既定では C:\Program Files (x86)\Windows Identity Foundation SDK\v4.0) のFedUtilSampleUserInput.xml や同フォルダ内のWindows.Identity.Foundation.chm ヘルプファイル、 /? オプションで表示されるヘルプメッセージを参照してください。
%FEDUTILPATH%\FedUtil.exe /u Web.config
以上で軽く動作確認ができる状態になりました。
 
一旦 Web アプリを ビルドします。画面を表示すると、統合されたマネージ パイプラインモードで適用されないことが検出されました。と表示されます。II6 以前で使用する system.web/httpModules が定義されているために発生するエラーです。 web.config の httpModules をコメントにしてください。

再度 リビルドして、エラーが発生しないことを確認します。

以上でアプリ側の作成は完了です。(実際には 後程、クレーム認証結果の POST 処理の場合 検証エラーとしないようにするカスタムの検証リクエストSampleRequestValidator.cs を作成します。

続いて [WIF] ADfS2.0 を使用する クレーム対応 Web アプリケーションを作成する その2 でADFS2.0 側で 証明書利用者の設定を行います。