フェデレーション認証の設定

Current version: 10.2
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

フェデレーション認証を使用して、ユーザーが外部プロバイダーを介して Sitecore にログインできるようにします。フェデレーション認証には、使用する外部プロバイダーに応じて、Sitecore を特定の方法で設定する必要があります。フェデレーション認証の設定には、次の複数のタスクが必要です。

ID プロバイダーの設定

使用する ID プロバイダーを設定する必要があります。この方法は、使用するプロバイダーによって異なります。主な使用例は、Azure Active Directory (Azure AD) を使用することです。「OpenID Connect と Azure Active Directory を使用して Web アプリケーションへのアクセスを承認する」では Azure AD が動作する仕組みについて説明しています。

ID プロバイダーを設定するには、次の手順に従います。

  1. identityProvider という名前の新しいノードを作成することで、configuration/sitecore/federatedAuthentication/identityProviders ノードにパッチを適用します。

  2. id 属性と type 属性の値を入力します。type は抽象クラス Sitecore.Owin.Authentication.Configuration.IdentityProvider を実装する必要があります。Sitecore には既定の実装 – Sitecore.Owin.Authentication.Configuration.DefaultIdentityProvider があります。

  3. 作成したノードの下に、paramcaptiondomaintransformations などの子ノードの値を入力します。

  4. configuration/sitecore/federatedAuthentication/identityProvidersPerSites ノードの下に、mapEntry という名前の新しいノードを作成します。

  5. name 属性と type 属性の値を入力します。name 属性の値はエントリごとに一意である必要があります。type は、Sitecore.Owin.Authentication.Collections.IdentityProvidersPerSitesMapEntrySitecore.Owin.Authentication であるか、これから継承する必要があります。

  6. resolve 属性の値として true を入力します。

  7. 作成したノードの下に、sites (プロバイダーが機能するサイトのリスト)、identityProviders (プロバイダーのリスト)、externalUserBuilder 子ノードなどの値を入力します。各 externalUserBuilder ノードの resolve 属性の値として true を入力します。

プロバイダーのコードを追加する

owin.identityProviders パイプラインの新しいプロセッサを作成する必要があります。

新しいプロセッサを作成するには、次の手順に従います。

  1. Sitecore.Owin.Authentication.Pipelines.IdentityProviders.IdentityProvidersProcessor クラスを継承します。

  2. 設定で identityProvider に指定した名前で IdentityProviderName プロパティをオーバーライドします。

  3. ProcessCore メソッドをオーバーライドします。

owin.identityProviders パイプラインと統合する

次に、コードを owin.identityProviders パイプラインに統合する必要があります。

たとえば、このサンプルでは ID プロバイダーとして Azure AD を使用しています。

RequestResponse
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/" xmlns:role="http://www.sitecore.net/xmlconfig/role/">
  <sitecore role:require="Standalone or ContentDelivery or ContentManagement">
    <pipelines>
      <owin.identityProviders>
        <processor type="Sitecore.Owin.Authentication.YourIdentityProviders.AzureAd, YourAssembly" resolve="true" />
      </owin.identityProviders>
    </pipelines>
  </sitecore>
</configuration>  

Sitecore ユーザー名の生成

ユーザー名は、Sitecore インスタンス全体で一意である必要があります。別の外部プロバイダーのユーザー名を Sitecore ユーザー名として使用することはできません。これは、ユーザー名が一意であることを保証するものではないためです。

DefaultExternalUserBuilder クラスは、指定された外部ユーザー名に対してユーザー名のシーケンスを作成します。次に、Sitecore にまだ存在していないこれらの名前の最初の名前を使用します。シーケンス内のこれらの値は、所定の ID プロバイダー用に設定された外部ユーザー名と Sitecore ドメインのみに依存します。

クレームとロールのマッピング

プロバイダーはクレームを発行し、各クレームに 1 つ以上の値を与えます。Sitecore は、外部認証処理中に認証されたユーザーに発行されたクレームを読み取ります。一部のリソースへのアクセスを、特定のクレームのみを持つID (クライアントまたはユーザー) に制限できます。

外部ユーザーとは、クレームを持っているユーザーです。クレームをロールにマッピングすると、Sitecore ロールベース認証システムで外部ユーザーを認証できます。

クレームをロールにマップするには、次の手順に従います。

  1. <identityProvider> ノードを configuration/sitecore/federatedAuthentication/identityProviders. に追加します。

  2. <transformations hint="list:AddTransformation"> ノードを <identityProvider> ノードに追加します。

  3. 変換ノードを子ノードとして追加します。

    たとえば、変換ノードの外観は次のとおりです。

    RequestResponse
    <transformation type="Sitecore.Owin.Authentication.Services.DefaultTransformation, Sitecore.Owin.Authentication">
      <sources hint="raw:AddSource">
        <claim name="groups" value="f04b11c5-323f-41e7-ab2b-d70cefb4e8d0" />
        <claim name="groups" value="40901f21-29d0-47ae-abf5-184c5b318471" />
      </sources>
      <targets hint="raw:AddTarget">
        <claim name="http://schemas.microsoft.com/ws/2008/06/identity/claims/role" value="Sitecore\Developer" />
      </targets>
      <keepSource>true</keepSource>
    </transformation>
    • typeSitecore.Owin.Authentication.Services.Transformation クラスから継承する必要があります。

    • この例では、変換により名前 http://schemas.microsoft.com/ws/2008/06/identity/claims/role と値 Sitecore\Developer のあるクレームが、名前 group と、値 f04b11c5-323f-41e7-ab2b-d70cefb4e8d0 および 40901f21-29d0-47ae-abf5-184c5b318471 の 2 つのクレームを持つ ID に同時に追加されます。

    • keepSource==true は、元のクレーム (この例では 2 つの group クレーム) は削除されないことを指定しています。既定は false で、これは、変換が ID に正常に適用された場合、元のクレームが、<targets>ノードに指定されているクレームに置き換えられることを意味します。

    • keepSource==true は、元のクレーム (この例では 2 つの group クレーム) は削除されないことを指定しています。Sitecore では、Sitecore.Owin.Authentication.Services.DefaultTransformationkeepSource の既定値は false で、これは、変換が ID に正常に適用された場合、元のクレームが、<targets> ノードに指定されているクレームに置き換えられることを意味します。

      注記

      Identity Server では、Sitecore.Plugin.IdentityProviders.DefaultClaimsTransformationkeepSource の既定値は true です。

注記

sitecore/federatedAuthentication/sharedTransformations ノードでクレーム変換を指定した場合、これらの変換はすべての ID プロバイダーに対して行われます。

プロパティのマッピング

ID クレームを、ユーザー プロファイルに格納されている Sitecore ユーザー プロパティにマップする必要があります。

sitecore\federatedAuthentication ノードの下の propertyInitializer ノードには、マップのリストが格納されます。各マップは、内部ソース ノードとターゲット ノードを含んでいます。これらのノードには 2 つの属性 namevalue があります。これらのプロパティの値を設定することで、プロパティをマップします。

クレームが、ソース ノードの name 属性 (および value (指定した場合)) と一致する場合、ターゲット ノードの name 属性で指定したユーザー プロパティの value 属性は、一致したクレームの値に設定されます (target ノードで value 属性を指定していない場合)。

例:

RequestResponse
<propertyInitializer type="Sitecore.Owin.Authentication.Services.PropertyInitializer, Sitecore.Owin.Authentication">
  <maps hint="list">
    <map name="status to UserStatus"
      type="Sitecore.Owin.Authentication.Services.DefaultClaimToPropertyMapper, Sitecore.Owin.Authentication">
      <data hint="raw:AddData">
        <source name="status" value="first" />
        <target name="UserStatus" value="1" />
      </data>
    </map>
  </maps>
</propertyInitializer>

この例で、ソースの name および value 属性は UserStatus ターゲットの名前と値 1 にマップされます。

重要

設定ファイルを分割する場合は、マップ ノードに name 属性を追加して、ノードがすべてのファイルで一意であることを確認する必要があります。これは、Sitecore 設定パッチの仕組みによるものです。

ユーザー アカウントの接続

アカウント接続を使用すると、一方の複数の外部アカウントともう一方の永続アカウント間でプロファイル データを共有できます。永続ユーザーにロールが割り当てられている場合、フェデレーション認証はこれらを外部アカウントと共有します。

以下の状況では、アカウントへの接続は自動で行われます。Sitecore は、認証されたユーザーをサインアウトし、新しい永続アカウントまたは仮想アカウントを作成して、このアカウントを認証します。

  • ユーザーはサイトですでに認証されています。

  • このユーザーは、外部プロバイダーと同じサイトにサインインします。

  • 外部 ID と既存の永続アカウントの間にはまだ接続がありません。ASP.NET Identity では、signInManager.ExternalSignIn(...) の後、SignInStatus.Failure が返されます。

外部 ID を、すでに認証されたアカウントにバインドするには、依存関係挿入を使用して Sitecore.Owin.Authentication.Services.UserAttachResolver クラスをオーバーライドする必要があります。次の手順は、これを行う例を示しています。

  1. 次のように、Sitecore.Owin.Authentication.Services.UserAttachResolver クラスを拡張します。

    RequestResponse
    using System;
    
    using System.Threading.Tasks;
    
    using Microsoft.Owin;
    
    using Sitecore.Owin.Authentication.Services;
    
    using Sitecore.Text;
    
    namespace Sitecore.Owin.Authentication.Samples.Services
    
    {
    
        public class SampleUserAttachResolver : UserAttachResolver
    
        {
    
            public override UserAttachResolverResult Resolve(UserAttachContext context)
    
            {
    
                IFormCollection formData = Task.Run(async () => await context.OwinContext.Request.ReadFormAsync()).Result;
    
                string consentResult = formData["uar_action"];
    
                UserAttachResolverResultStatus resultStatus;
    
                if (Enum.TryParse(consentResult, true, out resultStatus))
    
                {
    
                    return new UserAttachResolverResult(resultStatus);
    
                }
    
                string redirectUrl = new UrlBuilder("/dialogs/consent") { ["returnUrl"] = context.ReturnUrl }.ToString();
    
                context.OwinContext.Response.Redirect(redirectUrl);
    
                return new UserAttachResolverResult(UserAttachResolverResultStatus.DelayedResolve);
    
            }
    
        }
    
    }

    Resolve メソッドは、値引数として UserAttachContext を取り、コントローラーに要求を送信して、呼び出したコントローラーからの応答を処理します。

  2. MVC コントローラーとレイアウトを作成してエンドポイントを作成します。

    MVC コントローラー:

    RequestResponse
    using System.Web.Mvc;
    
    namespace Sitecore.Owin.Authentication.Samples.Controllers
    
    {
    
        public class ConsentController : Controller
    
        {
    
            public ActionResult Index()
    
            {
    
                this.ViewBag.User = this.HttpContext.User.Identity.Name;
    
                this.ViewBag.ReturnUrl = this.Request.Params["ReturnUrl"];
    
                return this.View();
    
            }
    
        }
    
    }

    レイアウト:

    RequestResponse
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <title>Consent window</title>
      </head>
    
      <body>
        <p>
          The @ViewBag.User user is already logged in. Would you like to attach to
          the user or create new record?
        </p>
    
        <br />
    
        <form method="POST" action="@ViewBag.ReturnUrl">
          <button type="submit" name="uar_action" value="attach">Attach</button>
    
          <button type="submit" name="uar_action" value="new">New</button>
        </form>
      </body>
    </html>
  3. 新しいサービス コンフィギュレーター クラスを作成して、拡張クラスを Sitecore に登録します。

    RequestResponse
    using Microsoft.Extensions.DependencyInjection;
    
    using Sitecore.DependencyInjection;
    
    using Sitecore.Owin.Authentication.Samples.Services;
    
    using Sitecore.Owin.Authentication.Services;
    
    namespace Sitecore.Owin.Authentication.Samples.Infrastructure
    
    {
    
        public class ServicesConfigurator : IServicesConfigurator
    
        {
    
            public void Configure(IServiceCollection serviceCollection)
    
            {
    
                serviceCollection.AddSingleton<UserAttachResolver, SampleUserAttachResolver>();
    
            }
    
        }
    
    }
  4. 次のノードを <sitecore> ノードの下に追加して、作成したクラスをカスタム設定ファイルで定義します。

    RequestResponse
    <services>
    
      <configurator
        type="Sitecore.Owin.Authentication.Samples.Infrastructure.ServicesConfigurator, Sitecore.Owin.Authentication.Samples" />
    
    </services>

プログラムによるアカウント接続管理

Sitecore はアカウント接続に ASP.NET Identity を使用します。このため、アカウント接続は ASP.NET Identity API と同じ方法で処理されます。

  1. 以下のように、Owin コンテキストから UserManager オブジェクトを取得します。

    RequestResponse
    using Sitecore.Owin.Authentication.Extensions;
    
    // [...]
    
    IOwinContext context = HttpContext.Current.GetOwinContext();
    
    UserManager<ApplicationUser> userManager = context.GetUserManager();
  2. CRUD 操作には次のメソッドを使用します。

    RequestResponse
    Task<IdentityResult> AddLoginAsync(ApplicationUser user, UserLoginInfo login);
    
    Task<IdentityResult> RemoveLoginAsync(ApplicationUser user, UserLoginInfo login);
    
    Task<IList<UserLoginInfo>> GetLoginsAsync(ApplicationUser user);
    
    Task<ApplicationUser> FindAsync(UserLoginInfo login);

仮想ユーザーと永続ユーザーの設定

Sitecore は仮想ユーザーをサポートします。外部プロバイダーを介してユーザーを認証する場合、Sitecore は適切なアクセス権を持つ仮想ユーザーを作成して認証します。

ただし、仮想ユーザーを使用するにはいくつかの欠点があります。仮想ユーザー プロファイルはユーザー セッションが続いている場合にのみ存在するため、ユーザー プロファイル データをセッション間で永続化することはできません。したがって、外部ユーザーごとに実際の永続ユーザーを作成する必要があります。ユーザーが初めて外部認証を使用すると、Sitecore は新しいユーザーを作成して永続化し、このユーザーを外部 ID プロバイダーとそのプロバイダーのユーザー ID にバインドします。次回ユーザーが同じ外部プロバイダーと同じ資格情報で認証を行うと、Sitecore はすでに作成され、永続化されているユーザーを見つけて認証します。

ユーザー ビルダー

identityProvidersPerSites/mapEntry ノードは externalUserBuilder ノードを含んでいます。次のようなユーザー ビルダーを追加します。

  • Sitecore.Owin.Authentication.Services.ExternalUserBuilder から継承するクラスを指定します。ユーザー ビルダーは、外部ユーザー情報に基づいて Sitecore ユーザーを作成する役割を果たします。

    永続ユーザーまたは仮想ユーザーを作成するために設定する既定の実装は、isPersistentUser コンストラクターのパラメーターに基づいています。

    RequestResponse
    <externalUserBuilder type="Sitecore.Owin.Authentication.Services.DefaultExternalUserBuilder, Sitecore.Owin.Authentication">
        <IsPersistentUser>true</IsPersistentUser>
    </externalUserBuilder>
注記

ユーザー ビルダーを実装する際は、データベースにユーザーを作成するために使用しないでください。ApplicationUser クラスのインスタンスのみを作成する必要があります。

サイトにビルダーを適用する

ユーザー ビルダーを定義するサイトの identityProvidersPerSites ノード内で mapEntry を見つけて、externalUserBuilder ノードを指定します。以下に例を示します。

RequestResponse
<mapEntry type="Sitecore.FederatedAuthentication.Collections.IdentityProvidersPerSitesMapEntry, Sitecore.FederatedAuthentication">
    <sites hint="list">
        <site>shell</site>
        <site>admin</site>
        <site>website</site>
    </sites>
    <identityProviders hint="list:AddIdentityProvider">mapEntry
        <identityProvider ref="federatedAuthentication/identityProviders/identityProvider[@id='AzureAd']" />
        <identityProvider ref="federatedAuthentication/identityProviders/identityProvider[@id='IdentityServer']" />
    </identityProviders>
    <externalUserBuilder type="Sitecore.Owin.Authentication.Services.DefaultExternalUserBuilder, Sitecore.Owin.Authentication">
         <param desc="isPersistentUser">true</param>
    </externalUserBuilder>
</mapEntry>

上記の例で、Sitecore はビルダーを shelladminwebsites などのサイトに適用します。

適用したビルダーは、関連するサイトのビルダーをオーバーライドします。

何かフィードバックはありますか?

この記事を改善するための提案がある場合は、