フェデレーテッド認証の設定
このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。
外部プロバイダーを通じてユーザーがSitecoreにログインできるようにするために、フェデレーテッド認証を使用します 。フェデレーテッド認証は、使用する外部プロバイダーによってSitecoreを特定の方法で設定する必要があります。フェデレーテッド認証の設定には、いくつかの作業が含まれます:
- アイデンティティプロバイダーの設定
- Sitecoreユーザー名生成
- 地図の主張と役割
- マップの性質
- ユーザーアカウントをConnectする
- 仮想ユーザーと永続ユーザーの設定
- サインインリンクを生成する
アイデンティティプロバイダーの設定
使用するアイデンティティプロバイダーの設定が必要です。これを行う方法は、使用するプロバイダーによって異なります。主なユースケースはAzure Active Directory(Azure AD)を使用することです。 OpenID ConnectとAzure Active Directoryを使ってウェブアプリケーションへのアクセスを承認するには 、Azure ADの動作方法が説明されています。
アイデンティティプロバイダーの設定:
-
configuration/sitecore/federatedAuthentication/identityProvidersノードをパッチ適用するには、identityProviderという名前の新しいノードを作成します。
-
idとtype属性の値を入力します。typeは抽象クラスを実装しなければなりませんSitecore.Owin.Authentication.Configuration.IdentityProvider。Sitecoreにはデフォルトの実装があります –Sitecore.Owin.Authentication.Configuration.DefaultIdentityProvider。
-
作成したノードの下に、param、caption、domain、clearroleswhensignin 、transformations子ノードの値を入力します。
!注clearroleswhensignin設定は、ユーザーに割り当てられた役割がSitecoreで管理されるか、外部アイデンティティプロバイダーで管理されるかを決定します。
デフォルト値はtrueです。これは、ユーザーがログインすると、すでにそのユーザーがSitecoreに持っているロールは削除され、外部プロバイダーで割り当てられたロールに置き換えられることを意味します。設定をfalseに変更すると、Sitecoreで既に割り当てられているロールが保持されます。
-
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を入力してください。
!注これはSXAサイトにも当てはまります。
プロバイダーのコードを追加
owin.identityProvidersパイプライン用の新しいプロセッサを作成しなければなりません。
新しいプロセッサを作成するには:
- Sitecore.Owin.Authentication.Pipelines.IdentityProviders.IdentityProvidersProcessorクラスを継承する。
- 設定中のidentityProviderの名前でIdentityProviderNameプロパティを上書きしてください。
- ProcessCoreメソッドを上書きしてください。
owin.identityProvidersパイプラインと統合してください
次に、コードをowin.identityProvidersパイプラインに統合する必要があります。
例えば、このサンプルはAzure ADをアイデンティティプロバイダーとして使用しています:
Sitecoreユーザー名生成
ユーザー名はSitecoreインスタンス全体で一意でなければなりません。異なる外部プロバイダーのユーザー名をSitecoreのユーザー名として使うことはできません。なぜなら、それがユーザー名の一意性を保証するわけではないからです。
DefaultExternalUserBuilderクラスは、与えられた外部ユーザー名に対して一連のユーザー名を作成します。そして、Sitecoreにまだ存在しない最初の名前を使用します。その列の値は、外部ユーザー名と指定されたアイデンティティプロバイダーに設定されたSitecoreドメインのみに依存します。
地図の主張と役割
プロバイダーはクレームを発行し、それぞれのクレームに1つ以上の値を与えます。Sitecoreは外部認証プロセス中に認証済みユーザーに対して発行されたクレームを読み取ります。特定のクレームを持つID(クライアントまたはユーザー)に一部のリソースへのアクセスを制限できます。
外部ユーザーはクレームを持つユーザーです。クレームをロールにマッピングすることで、Sitecoreの役割ベースの認証システムが外部ユーザーを認証できます。
主張を役割にマッピングするために:
-
ノードを に追加します。configuration/sitecore/federatedAuthentication/identityProviders. -
ノードに ノードを追加します。 -
子ノードとして変換ノードを追加します。
例えば、変換ノードは次のようになります:
true -
typeはSitecore.Owin.Authentication.Services.Transformation階級から継承しなければなりません。
-
keepSource==trueは元の請求(この例では2つのgroup請求)が削除されないことを指定します。デフォルトはfalseであり、変換が恒等式にうまく適用された場合、元の請求は
ノードに記載されたものに置き換えられます。 -
keepSource==true元の請求(この例では2つのgroup請求)は削除されないことを指定します。Sitecoreでは、Sitecore.Owin.Authentication.Services.DefaultTransformationに対してkeepSourceのデフォルト値はfalseであり、変換が恒等式にうまく適用された場合、元の請求は
ノードに記載されたものに置き換えられます。 !注アイデンティティサーバー上で、Sitecore.Plugin.IdentityProviders.DefaultClaimsTransformationの場合、keepSourceはデフォルト値trueです。
-
!注sitecore/federatedAuthentication/sharedTransformationsノードでクレーム変換を指定する場合、これらの変換はすべてのアイデンティティプロバイダーに対して行われます。
マップの性質
ユーザープロファイルに保存されているSitecoreのユーザープロパティにアイデンティティクレームをマッピングする必要があります。
propertyInitializerノードはsitecore\federatedAuthenticationノードの下に、マップのリストを格納します。各マップには内部のソースノードとターゲットノードがあります。これらのノードにはnameとvalueの2つの属性があります。プロパティはこれらのプロパティの値を設定することでマッピングします。
もしクレームがソースノードのname属性(および指定されている場合はvalue)に一致する場合、ターゲットノードのname属性によって指定されたユーザープロパティのvalue属性は、マッチしたクレームの値に設定されます(targetノードでvalue属性が指定されていない場合)。
例えば:
この例では、ソースnameとvalue属性がUserStatusターゲット名と値1にマッピングされています。
!重要設定ファイルを分割する場合は、マップノードにname属性を追加し、ノードがすべてのファイルで一意であることを確実にしてください。これは設定パッチのやり方Sitecore原因です。
地図のカスタムユーザープロパティ
カスタムユーザープロパティを、Sitecore.Owin.Authentication.Services.DefaultClaimToPropertyMapperが保存できる2か所にマッピングできます:
- ユーザーが仮想であれば、プロパティがカスタムかどうかに関わらず、Sitecore.Security.Accounts.Userクラスにプロパティとして保存.RuntimeSettings.Properties。
- ユーザーが永続的であれば、Sitecore.Security.Accounts.Userクラスにプロパティとして保存.Profile.CustomProperties。
デバッグや開発目的でこれらのプロパティを見ることは可能ですが、それらはプライベートプロパティであり、直接アクセスされることは期待されていません。
カスタム機能の場合、これらのプロパティにアクセスする場合は、プロパティのインデクサーProfileSitecore.Security.Accounts.Userクラスからアクセスできます。これにより、ユーザーが仮想的であれ永続的であれ、正しい位置からユーザープロパティを解決できます。
ユーザーアカウントをConnectする
アカウント接続により、複数の外部アカウント間でプロフィールデータを共有でき、一方で永続的なアカウントがもう一方に割り当てられます。永続化されたユーザーにロールが割り当てられている場合、フェデレーテッド認証はそれを外部アカウントと共有します。
以下の状況下では、アカウントへの接続は自動的に行われます。Sitecoreは認証済みユーザーからサインアウトし、新しい永続的または仮想アカウントを作成し、その後認証を行います。
- ユーザーはすでにサイト上で認証済みです。
- ユーザーは外部プロバイダーで同じサイトにサインインします。
- 外部アイデンティティと既存の永続アカウントとの間にはすでに接続がありません。ASP.NET Identityでは、 signInManager.ExternalSignIn(...) SignInStatus.Failureを返します。
外部アイデンティティをすでに認証済みのアカウントにバインドするには、依存性注入を使ってSitecore.Owin.Authentication.Services.UserAttachResolverクラスをオーバーライドする必要があります。以下の手順はその例を示しています:
-
Sitecore.Owin.Authentication.Services.UserAttachResolverクラスの拡張:
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を値引数として受け取り、コントローラにリクエストを送信し、呼び出したコントローラからの応答を処理します。
-
MVCコントローラーとレイアウトを作成してエンドポイントを作成します。
MVCコントローラー:
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();
}
}
}
レイアウト:
The @ViewBag.User user is already logged in. Would you like to attach to the user or create new record?
-
拡張クラスをSitecoreに登録するには、新しいサービス構成クラスを作成します:
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>();
}
}
}
-
作成したクラスをカスタム設定ファイルで定義し、
ノードの下に次のノードを追加します:
プログラム的アカウント接続管理
Sitecoreはアカウント接続にASP.NET Identityを使用しているため、アカウント接続はASP.NET Identity APIと同じ方法で処理されます。
-
OwinコンテキストからUserManagerオブジェクトを取得する:
using Sitecore.Owin.Authentication.Extensions;
// ...
IOwinContext context = HttpContext.Current.GetOwinContext();
UserManager
userManager = context.GetUserManager(); -
CRUD操作には以下の方法を用いてください:
Task
AddLoginAsync(ApplicationUser user, UserLoginInfo login); Task
RemoveLoginAsync(ApplicationUser user, UserLoginInfo login); Task<IList
> GetLoginsAsync(ApplicationUser user); Task
FindAsync(UserLoginInfo login);
仮想ユーザーと永続ユーザーの設定
Sitecoreは仮想ユーザーをサポートしています。外部プロバイダーを通じてユーザーを認証すると、Sitecoreは適切なアクセス権を持つ仮想ユーザーを作成・認証します。
しかし、仮想ユーザーを利用することにはいくつかの欠点があります。ユーザープロファイルデータはセッション間で永続化できません。なぜなら、仮想ユーザープロファイルはユーザーセッションが続く間のみ存在するためです。したがって、各外部ユーザーごとに実際の永続ユーザーを作成するべきです。ユーザーが初めて外部認証を使用すると、Sitecoreは新しいユーザーを作成・永続化し、このユーザーを外部IDプロバイダーとそのプロバイダーのユーザーIDにバインドします。次にユーザーが同じ外部プロバイダーと認証情報で認証した際、Sitecoreはすでに作成され永続化されたユーザーを見つけて認証します。
ユーザービルダー
identityProvidersPerSites/mapEntryノードにはexternalUserBuilderノードが含まれています。このようなユーザービルダーを追加してください:
-
Sitecore.Owin.Authentication.Services.ExternalUserBuilderから継承するクラスを指定します。ユーザービルダーは外部ユーザー情報に基づいてSitecoreユーザーを作成する責任があります。
永続ユーザーまたは仮想ユーザーを作成するためのデフォルトの実装は、isPersistentUserコンストラクタパラメータに基づいています。
true
!注ユーザービルダーを実装する際、データベース内でユーザーを作成するために使ってはいけません。 ApplicationUserクラスのインスタンスを作成するだけで十分です。
現場へのビルダーの適用
ユーザービルダーを定義するサイトのidentityProvidersPerSitesノード内でmapEntryを見つけ、externalUserBuilderノードを指定します。例えば:
上記の例では、Sitecoreビルダーをshell、admin、websitesサイトに適用します。
適用される建設業者は、該当サイトの建設業者を上書きします。
サインインリンクを生成する
Sitecoreサイト向けに外部アイデンティティプロバイダーを設定した後、getSignInUrlInfoパイプラインを通じてそれらのURLを生成できます。このパイプラインは、各アイデンティティプロバイダーの追加情報を含むサインインURLのリストを取得します。
!重要POSTリクエストではサインインリンクのみを使用してください。
サインインリンクを生成するには:
-
以下の例のようにgetSignInUrlInfoパイプラインを使用します:
using Sitecore.Pipelines.GetSignInUrlInfo; /* ... */ var args = new GetSignInUrlInfoArgs(site: "website", returnUrl: "/"); GetSignInUrlInfoPipeline.Run(corePipelineManager, args);
args.ResultはSitecore.Data.SignInUrlInfoオブジェクトの集合を含みます。これらのオブジェクトは以下の性質を持ちます。
- Href – URLです。
- IdentityProvider – 識別プロバイダーの名前です。例えば、リンクのCSSクラスとして使うことができます。
- Caption – アイデンティティ提供者のキャプション。これをリンクテキストとして使うべきです。
!注Sitecore依存注入を使って、BaseCorePipelineManagerクラスの実装を取得してください。