1

たとえば、ページ 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 条件が多すぎます。形式の複雑さが増すにつれて、これは増加すると思います。

手続きが完了するまで、ユーザーがサイトの他のページにアクセスしないようにするより良い方法はありますか?

御時間ありがとうございます。

4

3 に答える 3

2

おそらく[Authorize attribute] http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspxを確認する必要があります。その属性でアクションを装飾すると、ログインしているユーザーのみがアクセスでき、他のユーザーはアクセスできます。ログインページにリダイレクトされます。

有料/登録ユーザーの場合、これを継承して PaidUserAuthorize 属性を作成します。

public class PaidUserAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        if(filterContext.Result is HttpUnauthorizedResult)
        {
            filterContext.Result = new RedirectResult("/PaymentPage");
        }
    }
}

したがって、アクションを装飾する

[PaidUserAuthorize(Roles = "PaidUser", "Super User")]

未払いのユーザーを支払いページにリダイレクトします。

ユーザーの支払い後 - PaidUser ロールに追加します。したがって、彼らが再びアクションに行くとき、彼らはアクセスを許可されます.

于 2012-05-04T16:12:42.803 に答える
0

コントローラで[承認]アノテーションを使用するのはどうですか?独自のAuthorizeAttributesを作成することにより、使用または作成することを選択したMembershipProviderに基づいて、アクションごとの承認をカスタマイズできるようになります。

于 2012-05-04T16:06:42.567 に答える
0

Actin フィルターを作成して、アクセスを制限したいアクションまたはクラスに適用することもできます。アクション フィルターでは、OnActionExecuting メソッドをオーバーライドし、そこにチェック ロジックを実装する必要があります。やりたいことに基づいて、これらのビューへのアクセスを許可または拒否できます

サンプルについては、このリンクをチェックしてください

于 2012-05-04T16:05:16.817 に答える