いよいよ今回は、
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 Label | pasvfed | |
Public Service Name | http://pasvfed.cloudapp.net | |
Region | Anywhere 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のあるフォルダへ移動して、以下を実行します。
このとき、引数に先程Azure上で作成したサービスの名称を渡します。
実行すると、秘密キーのパスワードの作成、秘密キーのパスワード入力を求められるので「abc!123」を入力します。
※CreateCert.cmdをそのまま使う場合、パスワードはabc!123である必要があります。
詳しくはバッチファイルの中を見るとわかります。
その後、証明書インストール時にセキュリティの警告が出るのが「はい」をクリックします。
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を管理者として起動し、新しいプロジェクトを以下の通り作成します。
・SSLの設定
次に、WebロールのSSL設定を行います。
ソリューションエクスプローラからpasvfed→Roles→Webを右クリックしてプロパティウィンドウを表示します。
・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を管理者として起動し、新しいプロジェクトを以下の通り作成します。
項目 | 値 | 備考 |
プロジェクト名 | pasvfed | Azure上のサービス名と合わせます |
プロジェクトの種類 | Visual C# → Cloud Service | もちろん言語は任意 |
テンプレート | Windows Azure Cloud Service | |
追加するロール | ASP.NET Web Role | |
ロール名 | Web | もちろん任意 |
・SSLの設定
次に、WebロールのSSL設定を行います。
ソリューションエクスプローラからpasvfed→Roles→Webを右クリックしてプロパティウィンドウを表示します。
Certificatesメニューを開き、「Add Certificate」をクリックし、以下の通り証明書を設定します。
次に追加した証明書を使うようにエンドポイントの設定を行います。Endpointsメニューを開き、以下の様に設定します。
項目 | 値 | 備考 |
Name | pasvfed | |
Store Location | Local Machine | デフォルト |
Store Name | My | デフォルト |
Thumbprint | 右側のボタンをクリックして先ほど作成したpasvfedという名前の証明書を選択する |
次に追加した証明書を使うようにエンドポイントの設定を行います。Endpointsメニューを開き、以下の様に設定します。
項目 | 値 | 備考 | |
HTTP | 無効 | ||
HTTPS | 有効 | ||
Name | HttpsIn | デフォルト | |
Port | 443 | デフォルト | |
SSL certificate name | pasvfed | ドロップダウンリストから選択 |
・参照設定の追加
Webロールのプロジェクトの参照設定にオンプレミスと同様にMicrosoft.IdentityModelを追加します。
1点異なるのが、Microsoft.IdentityModelのプロパティに以下のパラメータを設定する必要がある点です。
・ローカルコピー:True
・特定バージョン:False
Webロールのプロジェクトの参照設定にオンプレミスと同様にMicrosoft.IdentityModelを追加します。
1点異なるのが、Microsoft.IdentityModelのプロパティに以下のパラメータを設定する必要がある点です。
・ローカルコピー:True
・特定バージョン:False
これは、Azure上のアプリケーションからWIFコンポーネントへアクセスできないため、
、ローカルコピーを有効にして強制的にプロジェクトパッケージにコンポーネントを含めるために行う設定です。
・STSへの参照を設定
これはオンプレミスと全く同じ手順です。
Webロールを右クリックして出てくるAdd STS referenceからWizardを開き、以下の設定を行います。※オンプレミスと異なる点はApplication URIのみです。
・Web.configの編集
Add STS referenceでWeb.configは書き換わるのですが、Azure上にアップロードした証明書の参照に関する設定を一部手動で追加する必要があります。
場所は、タグの内で、以下を追加します。
※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という環境でのシングルサインオンとかにも手を出したいところです。
、ローカルコピーを有効にして強制的にプロジェクトパッケージにコンポーネントを含めるために行う設定です。
・STSへの参照を設定
これはオンプレミスと全く同じ手順です。
Webロールを右クリックして出てくるAdd STS referenceからWizardを開き、以下の設定を行います。※オンプレミスと異なる点はApplication URIのみです。
ステップ | 設定項目 | 設定値 | 備考 |
Welcome | Application configuration location | プロジェクトのweb.configファイル | 初期状態で指定されているので変更不要 |
Application URI | https://pasvfed.cloudapp.net | 発行先となるURIを指定 | |
Security Token Service | Security Token Service (STS) option | Use an existing STS | 既に作成したADFS2.0をSTSとして指定 |
STS WS-Federation metadata document location | https://adfs20.eidentity.local/FederationMetadata/2007-06/FederationMetadata.xml | ADFS2.0のMetadataのエンドポイントを指定 | |
STS signing certificate chain validation error | Certificate validation option | Disable certificate chain validation | STSが自己署名入り証明書を使っているため、証明書チェーンの確認を無効化する |
Security Token encryption | Security Token encryption option | No 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という環境でのシングルサインオンとかにも手を出したいところです。
AzureとオンプレミスのSSOを勉強しています。
返信削除大変参考になりました。
ありがとうございます。