たとえば、ページ A、B、C、D などの Web サイトがあります。ユーザーが登録したページ A にのみアクセスできるようにしたいと考えています。残りのページにアクセスするには、ユーザーは支払いなどの参加手続きを完了する必要があります。
簡単な方法は、現在完了しているすべてのページにチェックを追加して、ユーザーがすべての参加手続きを完了した場合にのみ、要求されたページ B、C、D が表示されるようにすることです。これには、既存のすべてのページを最初からやり直す必要があります。また、今後開発されるすべてのページでは、そのチェックを忘れずに追加する必要があります。
これを回避するために、以下のスニペットのように、AuthorizeAttribute から継承するカスタム認証属性クラスを使用し、そこでオーバーライドされた OnAuthorization メソッドをチェックしました。
else if (!SessionCache.FormalitiesCompleted)
{
//force completion of formalities
if (!( string.Equals(filterContext.ActionDescriptor.ActionName, "Index", StringComparison.InvariantCultureIgnoreCase)
|| string.Equals(filterContext.ActionDescriptor.ActionName, "Options", StringComparison.InvariantCultureIgnoreCase)
|| string.Equals(filterContext.ActionDescriptor.ActionName, "Index_B", StringComparison.InvariantCultureIgnoreCase)
|| string.Equals(filterContext.ActionDescriptor.ActionName, "Index_C", StringComparison.InvariantCultureIgnoreCase)
&& string.Equals(filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, "Formalities", StringComparison.InvariantCultureIgnoreCase)))
{
string _action = filterContext.ActionDescriptor.ActionName;
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Formalities", action = _action, area = "FormalitiesArea" }));
}
}
ご覧のとおり、IF には OR 条件が多すぎます。形式の複雑さが増すにつれて、これは増加すると思います。
手続きが完了するまで、ユーザーがサイトの他のページにアクセスしないようにするより良い方法はありますか?
御時間ありがとうございます。