3

私たちのアプリケーションは WebForms から MVC に移行されています。承認を処理する別の方法があります。データベース ビューは、ユーザーの承認を確認するために照会されます。このビューは、各ユーザーに従って、すべてのメニュー階層を返します。たとえば、User1 が SecretList.aspx という名前のページにアクセスしようとすると、メニュー階層 (認証後に HTTP セッションに保存される) を介して検索が適用され、アクセス承認が確認されます。SecretList.aspx に関連するメニュー項目がそのユーザーに存在する場合、アクセスが許可されます。

私の質問は、ASP.NET MVC 3 でこのアプローチを実装する方法ですか?

各 Controller Action に Attributes を配置したくないので、Route ConstraintsCustom Controllerについて読んだことがあります。

制約をルーティングするには、HTTP セッションにアクセスして、認可クエリのメニュー階層を取得できますか?

カスタム コントローラーへ、どのメソッドをオーバーロードすることを検討する必要がありますか? コントローラが完全なアクション コードを実行する前に、承認を確認して別のビューにリダイレクトできますか?

他に良いアイデアはありますか?

4

2 に答える 2

2

すべてのアクションにグローバルに追加されるカスタムアクションフィルターを使用します。これは、組み込みの承認属性と非常によく似ています。アクションフィルターは、ルートが解決されてコントローラーが作成された後に実行されます(したがって、コントローラーに渡されるものはすべてユーザーが作成できる必要があります)。次に、ユーザーがアクションを実行できるかどうか、または代わりに別のActionResultを返す必要があるかどうかを確認できます。

承認属性のコードを表示するには、MVCソースを確認する(またはILSpyなどのツールを使用する)ことを強くお勧めします。

カスタムルート制約を使用することもできますが、それは事実上、ユーザーがアクセスを許可されていないのではなく、ユーザーのルートが存在しないことを意味します。

于 2012-04-25T02:29:15.897 に答える
1

属性をアクションに適用せず、アクセス ロジックをコントローラーとアクションの定義から遠ざける場合は、グローバル アクション フィルターを作成できます。

    public class MenuAccessAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting (ActionExecutingContext filterContext)
        {
            var requestRoute = filterContext.RouteData.Route;

            var currentUser = WebWorker.CurrentUser; // Or wathever is your thing to get the current user from session

            if (currentUser != null && !MenuAccessService.UserHasAccessToRoute(currentUser, requestRoute))
            {
                filterContext.Result = new RedirectToRouteResult("MenuAccessDenied");
            }

            base.OnActionExecuting(filterContext);
        }
    }

または、これらの線に沿った何か。

次に、global.asax Application_Start で

        GlobalFilters.Filters.Add(new MenuAccessAttribute());

しかし、もし私があなたなら、アクセス ロジックを asp.net mvc Roles に適応させ、カスタム RoleProvider を実装し、コントローラーとアクションを適切な Authorize 属性で装飾するのに時間を費やすでしょう。

于 2012-04-25T13:29:35.267 に答える