1733221931
2024-12-02 00:00:00
Optimizely DXP に展開されたサイトを操作する場合、特定の環境でのサイトへのアクセスを認証されたユーザーのみに制限したい場合があります。これは、まだ公開されていないサイトで作業していて、外部の訪問者にサイトの「作業中」バージョンを見られたくない場合に便利です。また、テストやトレーニングによく使用される非実稼働環境 (統合および実稼働前) でも、この要件がよく見られます。
これらの環境をロックダウンする 1 つの方法は、その環境に関連付けられたデータベースに保存されている環境の設定 (管理者モードとも呼ばれます) で Web サイトのアクセス権を更新することです。ただし、実稼働環境から非実稼働環境にコンテンツを頻繁に同期する場合、これらの設定は上書きされるため、常に忘れずに再更新する必要があります。
これを実現するより良い方法は、ユーザーがサイトにアクセスする前にログインを強制する承認フィルターを作成し、アクセスを制限したい DXP 環境でこのフィルターを使用することです。
認可フィルターの作成
認可フィルターを作成するには、 IAuthorizationFilter インタフェース。このインターフェースにはメソッドが 1 つあります。 OnAuthorization、それを実装する必要があります。
また、フィルタで特定のロールのみをオプションで許可できるようにすることで、これをさらに一歩進めます。
public class EnvironmentAuthorizationFilter : IAuthorizationFilter
{
private readonly string[] _roleNames;
public EnvironmentAuthorizationFilter()
: this(string.Empty)
{
}
public EnvironmentAuthorizationFilter(string roleName)
: this(new string[] { roleName })
{
}
public EnvironmentAuthorizationFilter(string[] roleNames)
{
_roleNames = roleNames.Where(str => !string.IsNullOrEmpty(str)).ToArray();
}
public void OnAuthorization(AuthorizationFilterContext context)
{
var controllerActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor;
if (controllerActionDescriptor != null)
{
if (controllerActionDescriptor.ControllerTypeInfo.IsDefined(typeof(AllowAnonymousAttribute), false) ||
controllerActionDescriptor.MethodInfo.IsDefined(typeof(AllowAnonymousAttribute), false))
{
return;
}
if (controllerActionDescriptor.ControllerTypeInfo.Equals(typeof(AccountController)))
{
return;
}
}
if (!context.HttpContext.User.Identity.IsAuthenticated)
{
context.Result = new ChallengeResult();
return;
}
if (_roleNames.Length == 0)
{
return;
}
foreach (var roleName in _roleNames)
{
if (context.HttpContext.User.IsInRole(roleName))
{
return;
}
}
context.Result = new ForbidResult();
}
}
承認フィルターでは、コントローラーまたはアクションを許可しています。 [AllowAnonymous] 属性を使用してチェックをバイパスします。認証なしでアクセスできるようにしたいカスタム API エンドポイントに対してこれを行う必要がありました。
このフィルターは、組み込みの Optimizely ログイン画面にアクセスするときにもチェックをバイパスします。ユーザーが認証されていない場合、ログイン画面にリダイレクトされるため、これは重要です。ログイン画面も保護されている場合、無限リダイレクト ループが発生します。
DXP環境の確認
サイトが特定の DXP 環境で実行されているかどうかを確認するには、 IHostEnvironment または IWebHostEnviroment サービスを使用するか、環境変数から環境名を取得できます。
(注: IWebHostEnviroment サービスはの拡張です IHostEnvironment サービスなので、すべて同じように機能します。これについて言及しているのは、よく見かけることだからです。 IWebHostEnviroment で使用されるサービス Startup.cs クラス (認可フィルターが登録される場所)。
環境を確認する方法の例をいくつか示します。
var environmentName = hostEnvironment.EnvironmentName;
var environmentName = System.Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
hostEnvironment.IsEnvironment("Development");
hostEnvironment.IsDevelopment();
hostEnvironment.IsProduction();
これをさらに一歩進めて、特定の DXP 環境を簡単に確認できるようにいくつかの拡張メソッドを作成してみましょう。
まず、DXP 環境を表す列挙型を作成しましょう。
public enum DxpEnvironment
{
None,
Integration,
Preproduction,
Production
}
次に、いくつかのヘルパー メソッドといくつかの拡張メソッドを作成しましょう。
public static class DxpEnvironmentExtensions
{
public static bool IsDxpEnvironment()
{
return GetDxpEnvironment() != DxpEnvironment.None;
}
public static bool IsDxpEnvironment(DxpEnvironment dxpEnvironment)
{
return GetDxpEnvironment() == dxpEnvironment;
}
public static bool IsDxpEnvironment(this IWebHostEnvironment webHostEnvironment)
{
return webHostEnvironment.GetDxpEnvironment() != DxpEnvironment.None;
}
public static bool IsDxpEnvironment(this IWebHostEnvironment webHostEnvironment, DxpEnvironment dxpEnvironment)
{
return webHostEnvironment.GetDxpEnvironment() == dxpEnvironment;
}
public static DxpEnvironment GetDxpEnvironment()
{
DxpEnvironment dxpEnvironment;
var environmentName = System.Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
if (!Enum.TryParse(environmentName, true, out dxpEnvironment))
{
dxpEnvironment = DxpEnvironment.None;
}
return dxpEnvironment;
}
public static DxpEnvironment GetDxpEnvironment(this IWebHostEnvironment webHostEnvironment)
{
DxpEnvironment dxpEnvironment;
if (!Enum.TryParse(webHostEnvironment.EnvironmentName, true, out dxpEnvironment))
{
dxpEnvironment = DxpEnvironment.None;
}
return dxpEnvironment;
}
}
DXP 環境を確認する方法ができたので、これを使用して認証フィルターを Startup.cs クラス。
認可フィルターの登録
認可フィルターを登録するには、 MvcOptions にフィルタを追加するには、 ConfigureServices のメソッド Startup.cs クラス。
これを DXP の非運用環境でのみ使用したい場合は、フィルターを追加する前に、DXP 環境を名前で確認します。
if (_webHostEnvironment.IsDxpEnvironment(DxpEnvironment.Integration) || _webHostEnvironment.IsDxpEnvironment(DxpEnvironment.Preproduction))
{
services.ConfigureMvcOptions>(options =>
{
options.Filters.Add(new EnvironmentAuthorizationFilter());
});
}
または、すべての DXP 環境へのアクセスをロックダウンしたい場合は、 IsDxpEnvironment 拡張メソッド:
if (_webHostEnvironment.IsDxpEnvironment())
{
services.ConfigureMvcOptions>(options =>
{
options.Filters.Add(new EnvironmentAuthorizationFilter());
});
}
オプションでロール名またはロール名の配列を渡すこともできることを忘れないでください。 EnvironmentAuthorizationFilter コンストラクタ。これにより、特定の役割を持つユーザーのみがサイトにアクセスできるようになります。
options.Filters.Add(new EnvironmentAuthorizationFilter("WebAdmins"));
options.Filters.Add(new EnvironmentAuthorizationFilter(new string[] { "WebAdmins", "WebEditors" }));
それで終わりです!これで、認証されたユーザーのみが DXP 環境のサイトにアクセスできるようになります。
#認可フィルターを使用して #Optimizely #DXP #環境に強制ログインする