2010年1月16日土曜日

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

意外とご好評を頂いた?このシリーズも今回で最終回です。

いよいよ今回は、
3.Azure上のアプリケーションを作成・発行する
4.シングルサインオンしてみる
をお送りします。


初回にも書きましたが、Azure上でもオンプレミスと同じコードが動きますが、環境面での違いを吸収するために少々設定が必要になります。

環境面での違いをまとめると、下記のようになります。

ポイントAzureオンプレミス
証明書のインストール方法サービス毎に証明書をアップロードIISへの設定
Webサイトへの証明書のバインド方法プロジェクト側(WebRole)で使う証明書を指定IISのサイトの設定
WIFコンポーネントの呼び出し方法プロジェクトにWIFコンポーネントをパッケージングして一緒にデプロイアプリケーションサーバにインストールされているWIFコンポーネントへアクセス


では作業を始めます。
流れとしては、
・Azure上へサービスを作成する
・証明書を準備する
・Azure上へ証明書をアップロードする
・アプリケーションを作成する
・Azure上へデプロイ/実行する
・ADFS2.0にRelyingPartyを設定する
・Azure上のアプリケーションの動作を確認する
・オンプレミスアプリケーションとのSSO動作を確認する
となります。

少々ステップが多くなりますが、順番に見ていきます。

◆Azure上へサービスを作成する

 プロジェクトを開き、New ServiceからHostedサービスを作成します。
 注)ここで作成したサービス名を証明書にも使うので記録しておきます。
   今回は「pasvfed」という名前を使いました。







 サービスを追加し、Hosted Servicesを選択します。













 以下のパラメータでサービスを作成します。

項目設定値備考
Service Labelpasvfed
Public Service Namehttp://pasvfed.cloudapp.net
RegionAnywhere US何故かAnywhere AsiaだとDr. Watsonが出たので



◆証明書を準備する

 証明書を作成するのにネイティブ暗号化APIモジュール(CAPICOM)を使用します。
 もちろん上記リンクからダウンロードしても良いのですが、Identity Training Kitに入っているので今回はそちらを使いました。(CAPICOMそのものよりも後で出てくる証明書作成のバッチファイルが欲しかったので)
 ※ちなみにCAPICOMは<Identity Training Kitインストールフォルダ>\Labs\WindowsAzureAndPassiveFederation\Source\Setup\Scripts以下にあるcapicom_dc_sdk.msiです。

 インストールが終わったら証明書の作成とインストールを行います。
 インストールは同じく<Identity Training Kitインストールフォルダ>\Labs\WindowsAzureAndPassiveFederation\Source\Assets以下にある、CreateCert.cmdを使います。

 まず、Visual Studioコマンドプロンプトを管理者で実行します。




















 CreateCert.cmdのあるフォルダへ移動して、以下を実行します。

xxxx:\> CreateCert.cmd pasvfed

 このとき、引数に先程Azure上で作成したサービスの名称を渡します。

 実行すると、秘密キーのパスワードの作成、秘密キーのパスワード入力を求められるので「abc!123」を入力します。
 ※CreateCert.cmdをそのまま使う場合、パスワードはabc!123である必要があります。
  詳しくはバッチファイルの中を見るとわかります。























 その後、証明書インストール時にセキュリティの警告が出るのが「はい」をクリックします。





















 コマンドが成功するとcertsフォルダの中に、
 ・pasvfed.cloudapp.net.cer
 ・pasvfed.cloudapp.net.pfx
 ・pasvfed.cloudapp.net.pvk
 という3つのファイルが出来上がります。


◆Azure上へ証明書をアップロードする

 先程作成した証明書をAzure上へ予めアップロードしておきます。手順としてAzureのサービスのCertificatesからManageをクリックします。







 作成した証明書(pfxファイル)を選択肢、パスワードに先ほど指定した「abc!123」を指定し、uploadを行います。










 成功するとInstalled Certificatesにアップロードした証明書が表示されます。


◆アプリケーションを作成する

・プロジェクトの作成

 オンプレミス側で実行したのと同様にVSを管理者として起動し、新しいプロジェクトを以下の通り作成します。

項目備考
プロジェクト名pasvfedAzure上のサービス名と合わせます
プロジェクトの種類Visual C# → Cloud Serviceもちろん言語は任意
テンプレートWindows Azure Cloud Service
追加するロールASP.NET Web Role
ロール名Webもちろん任意
































・SSLの設定

 次に、WebロールのSSL設定を行います。
 ソリューションエクスプローラからpasvfed→Roles→Webを右クリックしてプロパティウィンドウを表示します。


















 Certificatesメニューを開き、「Add Certificate」をクリックし、以下の通り証明書を設定します。

項目備考
Namepasvfed
Store LocationLocal Machineデフォルト
Store NameMyデフォルト
Thumbprint右側のボタンをクリックして先ほど作成したpasvfedという名前の証明書を選択する









 次に追加した証明書を使うようにエンドポイントの設定を行います。Endpointsメニューを開き、以下の様に設定します。

項目備考
HTTP無効
HTTPS有効

NameHttpsInデフォルト

Port443デフォルト

SSL certificate namepasvfedドロップダウンリストから選択


















・参照設定の追加

 Webロールのプロジェクトの参照設定にオンプレミスと同様にMicrosoft.IdentityModelを追加します。
 1点異なるのが、Microsoft.IdentityModelのプロパティに以下のパラメータを設定する必要がある点です。

 ・ローカルコピー:True
 ・特定バージョン:False


















 これは、Azure上のアプリケーションからWIFコンポーネントへアクセスできないため、
、ローカルコピーを有効にして強制的にプロジェクトパッケージにコンポーネントを含めるために行う設定です。


・STSへの参照を設定

 これはオンプレミスと全く同じ手順です。
 Webロールを右クリックして出てくるAdd STS referenceからWizardを開き、以下の設定を行います。※オンプレミスと異なる点はApplication URIのみです。

ステップ設定項目設定値備考
WelcomeApplication configuration locationプロジェクトのweb.configファイル初期状態で指定されているので変更不要
Application URIhttps://pasvfed.cloudapp.net発行先となる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


・Web.configの編集

 Add STS referenceでWeb.configは書き換わるのですが、Azure上にアップロードした証明書の参照に関する設定を一部手動で追加する必要があります。
 場所は、タグの内で、以下を追加します。

<servicecertificate>
 <certificatereference x509findtype="FindByThumbprint" findvalue="xxxxxx">
</servicecertificate>

※ThumbprintはWebロールに設定した証明書のものを使用


・Default.aspxのコーディング

 いよいよ実装ですが、コードはオンプレミスと全く同じものを使います。














 ここまででアプリケーションの実装は完了です。次はいよいよAzure上へのデプロイです。


◆Azure上へデプロイ/実行する

 ソリューションエクスプローラからpasvfedプロジェクトを右クリックして「発行」をクリックします。

 自動的にパッケージファイルが作成されたフォルダとブラウザが開き、Azureのサイトへ移動されます。

 プロジェクトからサービスを開き、Production環境のDeployボタンをクリックします。
 ※今回は直接Production環境へデプロイします。これは、Azure上のアプリケーションはローカル、ステージング、プロダクションのそれぞれの環境でURIが変わるため、Passive Federationではアプリケーション→STS→アプリケーションとリダイレクションで遷移させる際に実行環境によって遷移先が変わってしまうためです。本当はHOSTヘッダをみて遷移先を変えるなどの工夫をするのですが、STSにADFS2.0を使う場合はそのあたりの作り込みが出来ない?ので、私は開発環境、ステージング環境もそれぞれRelying Partyとして登録しています。(ただの調査不足かも知れませんが)













 先ほど出来上がったパッケージファイルと構成ファイルをアップロードします。
 ラベルは適当な文字列でOKです。



























 デプロイが完了したらRunをクリックしアプリケーションを実行します。












 ステータスがInitializingになると、しばらく時間がかかるのでその間にSTSの設定をしておきましょう。












◆ADFS2.0にRelyingPartyを設定する

 これは前回オンプレミスで作成したのと同様の手順です。今回作成したアプリケーションのFederationMetadata.xmlを読み込ませると自動的にRelyingPartyのURIとしてpasvfed.cloudapp.netが設定されます。






◆Azure上のアプリケーションの動作を確認する

 そんなことをしているうちに、AzureのサービスのステータスがReadyになります














 準備が出来たら、ブラウザでhttps://pasvfed.cloudapp.net/へアクセスしてみます。
 オンプレミスと同じようにSTSへリダイレクトされ、ログインするとAzure上のアプリケーションが表示されます。

























◆オンプレミスアプリケーションとのSSO動作を確認する

 最後に、本当にオンプレミスとシングルサインオンになっているかを試してみます。

 最初にオンプレミスへアクセスします。
 するとSTSへリダイレクトされ、オンプレミスアプリケーションが表示されます。














 そのまま、オンプレミス上の「Azureアプリケーション」というハイパーリンクをクリックします。すると今度はSTSへのログオンすることなく、Azure上のアプリケーションが表示されます。











 ということで、今回作成した環境で本当に基礎的なクレームベースのWebアプリケーションではありますが、オンプレミスとクラウドのアプリケーションのシングルサインオンが実現出来ました。

 他にも色々とやりたい事が尽きないのですが、是非今度はOpenSSOとADFS2.0のフェデレーション環境下でオンプレミスはOpenSSO、AzureはWIF/ADFSという環境でのシングルサインオンとかにも手を出したいところです。

1 件のコメント:

Unknown さんのコメント...

AzureとオンプレミスのSSOを勉強しています。
大変参考になりました。
ありがとうございます。