前回の記事では Sitecore 用のプロジェクトでAzure ACS にリダイレクトしてログインを行う サブレイアウトを作成しました。リダイレクト処理が動作するには Sitecore の Web サイトで使用する Web.config に Azure ACS (アクセス制御サービス) を使用するための WIF(Windows Identity Foundation) の設定が行われている必要があります。

Visual Studioで作成したプロジェクトには Web.config を管理していないので、 Sitecore の Web.config に Azure ACS 用の Web.config の設定をマージする必要があります。今回は1例としてダミープロジェクトを作成して Azure ACS を使用するように Web.config を構成し、その内容を Sitecore の Web.config にマージすることで環境のセットアップを行います。

今回の記事を進める前提として、 前回の記事 で記載しているような Visual Studio のプロジェクトがセットアップ済みであることと以下の記事で紹介されているようにAzure ACSの設定と Azure ACS を使用する Web アプリケーションの登録が完了していることとします。本記事でも記事の内容に一致するように Web.config を生成するようにしています。

Web.configのマージ内容は .NET のバージョンや Sitecore のバージョンなどで異なる可能性があるので注意して下さい。

1. ダミーのプロジェクトの作成とweb.configの構成

Visual Studio 上にAzure ACS(Access Control Service) を使用して認証を行うような 新しいプロジェクトを作成します。ソリューションエクスプローラー上で プロジェクトを新規作成します。下図のように ASP.NET Web アプリケーション をテンプレートにして Webアプリケーションプロジェクトを作成します。

新規 ASP.NET プロジェクトで Web Form をテンプレートとして選択します。この画面で 認証の変更をクリックします。

認証の変更ダイアログが表示されます。Azure ACS 用の Web.config を生成する場合は 組織アカウント を選択してください。 ドロップダウンで 社内 を選択します。社内の認証機関のメタデータのURLとしてAzure ACS の WS-FederationのメタデータのURLを設定します。アプリケーション ID URL に Sitecore の Webサイトの URLを入力します。WS-Federation メタデータのURLや証明者利用者アプリケーションのアプリケーションIDに関しては[Azure ACS] Relying Party(証明者利用者アプリケーション) の設定を参照してください。入力が終わったら OK ボタンをクリックします。

ダミープロジェクトの作成は完了です。生成された Web.config を SitecoreのWeb.config にマージしてください。

例えば、 configSection タグでは、次のタグを追加します。

  <configSections>
    <section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
    <section name="system.identityModel.services" type="System.IdentityModel.Services.Configuration.SystemIdentityModelServicesSection, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
  </configSections>

appSettingsタグでは、次の項目を追加します。

  <appSettings>
    <add key="ida:FederationMetadataLocation" value="https://test1234.accesscontrol.windows.net/FederationMetadata/2007-06/FederationMetadata.xml " />
    <add key="ida:Realm" value="http://scacs/" />
    <add key="ida:AudienceUri" value="http://scacs/" />
  </appSettings>

system.webServer/modules タグの最後にWIF用の以下のモジュールを追加しました。

  <system.webServer>
    <modules>
      <add name="WSFederationAuthenticationModule" type="System.IdentityModel.Services.WSFederationAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />
      <add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />
    </modules>
  </system.webServer>

上記でさらに、 sessionAuthenticationModule のtype属性は カスタムで作成したものに変更します。

      <add name="SessionAuthenticationModule" type="ScAcs.Web.Fx.CustomSessionAuthenticationModule, ScAcs.Web" preCondition="managedHandler" />

system.identityModelおよびsystem.identityModel.services は configurationタグの最後にそのまま追加しました

  <system.identityModel>
    <identityConfiguration>
      <audienceUris>
        <add value="http://scacs/" />
      </audienceUris>
      <securityTokenHandlers>
        <add type="System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </securityTokenHandlers>
      <certificateValidation certificateValidationMode="None" />
      <issuerNameRegistry type="System.IdentityModel.Tokens.ValidatingIssuerNameRegistry, System.IdentityModel.Tokens.ValidatingIssuerNameRegistry">
        <authority name="https://test1234.accesscontrol.windows.net/">
          <keys>
            <add thumbprint="9DFE3212124DFAB9F515A5AC2D4034D694144AB8" />
          </keys>
          <validIssuers>
            <add name="https://test1234.accesscontrol.windows.net/" />
          </validIssuers>
        </authority>
      </issuerNameRegistry>
    </identityConfiguration>
  </system.identityModel>


  <system.identityModel.services>
    <federationConfiguration>
      <cookieHandler requireSsl="true" />
      <wsFederation passiveRedirectEnabled="true" issuer="https://test1234.accesscontrol.windows.net/v2/wsfederation" realm="http://scacs/" requireHttps="true" />
    </federationConfiguration>
  </system.identityModel.services>

コピー後 cookieHandler の requireSsl="true""false" に変更してください。この設定変更をしないと認証クッキーは https(暗号化通信)を使用していない場合に クライアントからサーバーに渡されなくなるので、認証情報の取得できなくなります。今回はテスト目的なので https 通信をしていなくても認証クッキーをサーバーに送信するようにします。本番のサイトでは当然 https の環境をセットアップして下さい。

最後に、httpRuntimeタグに requestValidatinoMode="2.0" を設定します。CD環境のような サイトコアクライアントインタフェースを使わない環境の場合は requestValidatinoMode="4.5"でもよいのかもしれませんが、CM環境とWeb.configを共有する場合は requestValidationModeを2.0にします。

繰り返しになりますが、マージする内容は 証明書利用者アプリケーションの設定や Azure ACS, .NET や Sitecore のバージョンなどによって異なるので注意してください。

Web.configを設定した後 Sitecore を引き続き使用できることを確認してください。

2.動作確認

動作確認をするためにサイトコアのアイテムを下図のように作成しました。 login がログイン用のページ。secure がセキュリティ設定のされたアイテムです。

下図のように Anonymous ユーザーがsecureアイテムにアクセスした場合は 画面を表示できないように 読み取り権限を拒否に設定しました。

また、サンプルプログラムでは AuthenticatedUsers ロールが存在することを前提とした開発をしているので AuthenticatedUsers ロールを extranet ドメインに作成します。

動作テスト用に web.config の <sites> タグの website の設定に loginPage ="/login" の設定を追加しています。

home,login,secureで LoginState サブレイアウトを配置してログインユーザーのアカウントと所属ロール一覧を出力するようにしています。 Loginアイテムには ExternalLogin サブレイアウトを配置して Azure ACS を使用したログインができるようになっています。変更を行ったらサイトをパブリッシュしてください。

実際に 外部サイトにアクセスしています。secure ページへのリンクをクリックします。

ログインページ(loginアイテム) にリダイレクトされました。Azure ACS ログイン ボタンをクリックします。

ページがリダイレクトされ Azure ACS のサインイン画面が表示されます。表示される 認証プロバイダーの種類は Azure ACS での設定に依存します。

Yahoo を選択してみます。yahoo.com の画面での 認証成功後、FireFoxの場合は次の様な警告メッセージが表示されます。 リダイレクト先が https ではないのでこのような警告が表示されますが、今回は動作検証目的なのでそのまま "続ける" をクリックします。

先に記載した Web.config の 設定で requestValidatinoMode の設定を忘れていると リダイレクト後の画面で "危険な可能性のある Request.Form 値がクライアント (wresult="<t:RequestSecurityTo...") から検出されました。" というメッセージが画面に表示される可能性があります。

上記のようなエラーが発生した場合は [WIF] ADFS2.0 を使用する クレーム対応 Web アプリケーションを作成する その3 で紹介している方法やWeb.configのhttpRuntimeの requestValidationModeを "2.0" に変更します。

設定が上手くいっている場合は次の最終的に secure ページにリダイレクトされます。Virtual User としてログインし、AuthenticatedUsers ロールでログインしていることがわかります

3.まとめ

説明は以上です。 Sitecore の 配信環境用に Azure ACS を使用した外部認証プロバイダーを使用するユーザー認証のサンプルをご紹介しました。 Azure ACS を例に認証を行いましたが、WIFが対応WS-Federation/WS-Trustをサポートする  ADFS 2.0 などのSTSでも同じようにしてシングルサインオン認証することができると思います。

そのほか ASP.NET 4.5 から提供される OpenID や OpenAuth を使用する Google, Facebook, Twitter, Microsoftアカウント などのソーシャルアカウントを使用したログインをサポートするAPIが提供されるようになったのでそちらを使用した場合のSitecreのWebサイトの認証についても時間があれば記事を作成してみたいと思っています。