6

メニュー項目を表示するためのユーザー アクセス ロールを指定する、現在定義されている Controller/Action Authorize 属性を再利用しようとしています (そのため、ユーザーにはアクセス権のあるメニュー項目のみが表示されます)。

現在、メニュー項目の表示とコントローラー/アクション認可属性の役割は別個のものであるため、変更を加えると 2 つの場所で更新する必要があり、将来的にエラーが発生する可能性があります。

私はカスタム承認属性を調べてきましたが、これは私がこれまでに持っているものです:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var isAuthorized = base.AuthorizeCore(httpContext);
        if (!isAuthorized)
        {
            return false;
        }

        var routeData = httpContext.Request.RequestContext.RouteData;
        string currentAction = routeData.GetRequiredString("action");
        string currentController = routeData.GetRequiredString("controller");

        var currentUserRoles = GetCurrentUserRoles();

        // from the list of menu items, find the menu item with the current action
        // and controller and check the current user's roles entitle access
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary(
                new
                {
                    controller = "Error",
                    action = "Unauthorised"
                })
            );
    }
}

MenuItems は基本的に、メニュー項目を使用できるユーザー ロール、フロントエンド表示用のテキスト ラベル、およびコントローラーとアクションからの URL で構成されます。MenuItem は、現在のユーザーが MenuItem を表示するために必要な役割にあるかどうかに応じて、部分的なビューでレンダリングされます。

私が見る限り、両方の領域で再利用されるすべてのコントローラー アクションと関連するユーザー ロールの完全なリストが必要になる場合があります。これを実現するためのより洗練された方法はありますか?

4

2 に答える 2

0

最善の方法は、承認ロジックを別のクラスに配置し、別の場所で使用することです。たとえば、CustomAuthorize、メニュー項目の制限などです。そうすればDRYに違反しません。

于 2013-08-05T15:18:33.490 に答える