フェデレーション認証の設定
このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。
フェデレーション認証を使用して、ユーザーが外部プロバイダーを介して Sitecore にログインできるようにします。フェデレーション認証には、使用する外部プロバイダーに応じて、Sitecore を特定の方法で設定する必要があります。フェデレーション認証の設定には、次の複数のタスクが必要です。
ID プロバイダーの設定
使用する ID プロバイダーを設定する必要があります。この方法は、使用するプロバイダーによって異なります。主な使用例は、Azure Active Directory (Azure AD) を使用することです。「OpenID Connect と Azure Active Directory を使用して Web アプリケーションへのアクセスを承認する」では Azure AD が動作する仕組みについて説明しています。
ID プロバイダーを設定するには、次の手順に従います。
-
identityProvider
という名前の新しいノードを作成することで、configuration/sitecore/federatedAuthentication/identityProviders
ノードにパッチを適用します。 -
id
属性とtype
属性の値を入力します。type
は抽象クラスSitecore.Owin.Authentication.Configuration.IdentityProvider
を実装する必要があります。Sitecore には既定の実装 –Sitecore.Owin.Authentication.Configuration.DefaultIdentityProvider
があります。 -
作成したノードの下に、
param
、caption
、domain
、transformations
などの子ノードの値を入力します。 -
configuration/sitecore/federatedAuthentication/identityProvidersPerSites
ノードの下に、mapEntry
という名前の新しいノードを作成します。 -
name
属性とtype
属性の値を入力します。name
属性の値はエントリごとに一意である必要があります。type
は、Sitecore.Owin.Authentication.Collections.IdentityProvidersPerSitesMapEntry
、Sitecore.Owin.Authentication
であるか、これから継承する必要があります。 -
resolve
属性の値としてtrue
を入力します。 -
作成したノードの下に、
sites
(プロバイダーが機能するサイトのリスト)、identityProviders
(プロバイダーのリスト)、externalUserBuilder
子ノードなどの値を入力します。各externalUserBuilder
ノードのresolve
属性の値としてtrue
を入力します。
プロバイダーのコードを追加する
owin.identityProviders
パイプラインの新しいプロセッサを作成する必要があります。
新しいプロセッサを作成するには、次の手順に従います。
-
Sitecore.Owin.Authentication.Pipelines.IdentityProviders.IdentityProvidersProcessor
クラスを継承します。 -
設定で
identityProvider
に指定した名前でIdentityProviderName
プロパティをオーバーライドします。 -
ProcessCore
メソッドをオーバーライドします。
owin.identityProviders パイプラインと統合する
次に、コードを owin.identityProviders
パイプラインに統合する必要があります。
たとえば、このサンプルでは ID プロバイダーとして Azure AD を使用しています。
<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 ロールベース認証システムで外部ユーザーを認証できます。
クレームをロールにマップするには、次の手順に従います。
-
<identityProvider>
ノードをconfiguration/sitecore/federatedAuthentication/identityProviders.
に追加します。 -
<transformations hint="list:AddTransformation">
ノードを<identityProvider>
ノードに追加します。 -
変換ノードを子ノードとして追加します。
たとえば、変換ノードの外観は次のとおりです。
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>
-
type
はSitecore.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.DefaultTransformation
のkeepSource
の既定値はfalse
で、これは、変換が ID に正常に適用された場合、元のクレームが、<targets>
ノードに指定されているクレームに置き換えられることを意味します。注記Identity Server では、
Sitecore.Plugin.IdentityProviders.DefaultClaimsTransformation
のkeepSource
の既定値はtrue
です。
-
sitecore/federatedAuthentication/sharedTransformations
ノードでクレーム変換を指定した場合、これらの変換はすべての ID プロバイダーに対して行われます。
プロパティのマッピング
ID クレームを、ユーザー プロファイルに格納されている Sitecore ユーザー プロパティにマップする必要があります。
sitecore\federatedAuthentication
ノードの下の propertyInitializer
ノードには、マップのリストが格納されます。各マップは、内部ソース ノードとターゲット ノードを含んでいます。これらのノードには 2 つの属性 name
と value
があります。これらのプロパティの値を設定することで、プロパティをマップします。
クレームが、ソース ノードの name
属性 (および value
(指定した場合)) と一致する場合、ターゲット ノードの name
属性で指定したユーザー プロパティの value
属性は、一致したクレームの値に設定されます (target
ノードで value
属性を指定していない場合)。
例:
<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
クラスをオーバーライドする必要があります。次の手順は、これを行う例を示しています。
-
次のように、
Sitecore.Owin.Authentication.Services.UserAttachResolver
クラスを拡張します。RequestResponseusing 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
を取り、コントローラーに要求を送信して、呼び出したコントローラーからの応答を処理します。 -
MVC コントローラーとレイアウトを作成してエンドポイントを作成します。
MVC コントローラー:
RequestResponseusing 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>
-
新しいサービス コンフィギュレーター クラスを作成して、拡張クラスを Sitecore に登録します。
RequestResponseusing 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>(); } } }
-
次のノードを
<sitecore>
ノードの下に追加して、作成したクラスをカスタム設定ファイルで定義します。RequestResponse<services> <configurator type="Sitecore.Owin.Authentication.Samples.Infrastructure.ServicesConfigurator, Sitecore.Owin.Authentication.Samples" /> </services>
プログラムによるアカウント接続管理
Sitecore はアカウント接続に ASP.NET Identity を使用します。このため、アカウント接続は ASP.NET Identity API と同じ方法で処理されます。
-
以下のように、Owin コンテキストから UserManager オブジェクトを取得します。
RequestResponseusing Sitecore.Owin.Authentication.Extensions; // [...] IOwinContext context = HttpContext.Current.GetOwinContext(); UserManager<ApplicationUser> userManager = context.GetUserManager();
-
CRUD 操作には次のメソッドを使用します。
RequestResponseTask<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
ノードを指定します。以下に例を示します。
<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 はビルダーを shell
、admin
、websites
などのサイトに適用します。
適用したビルダーは、関連するサイトのビルダーをオーバーライドします。
サインイン リンクの生成
Sitecore サイトの外部 ID プロバイダーを設定した場合、getSignInUrlInfo
パイプラインを介してこれらの URL を生成できます。このパイプラインは、このリスト内の対応する ID プロバイダーごとに追加情報を含むサインイン URL のリストを取得します。
POST 要求ではサインイン リンクのみを使用する必要があります。
サインイン リンクを生成するには、次の手順に従います。
-
次の例のように、
getSignInUrlInfo
パイプラインを使用します。RequestResponseusing Sitecore.Pipelines.GetSignInUrlInfo; /* [...] */ var args = new GetSignInUrlInfoArgs(site: "website", returnUrl: "/"); GetSignInUrlInfoPipeline.Run(corePipelineManager, args);
args.Result
は Sitecore.Data.SignInUrlInfo
オブジェクトのコレクションを含んでいます。これらのオブジェクトには、次のプロパティがあります。
-
Href
– URL。 -
IdentityProvider
– ID プロバイダーの名前。たとえば、リンクの CSS クラスとして使用できます。 -
Caption
– ID プロバイダーのキャプション。これをリンク テキストとして使用する必要があります。
Sitecore の依存関係挿入を使用して、BaseCorePipelineManager
クラスの実装を取得します。