メニュー項目を表示するためのユーザー アクセス ロールを指定する、現在定義されている 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 を表示するために必要な役割にあるかどうかに応じて、部分的なビューでレンダリングされます。
私が見る限り、両方の領域で再利用されるすべてのコントローラー アクションと関連するユーザー ロールの完全なリストが必要になる場合があります。これを実現するためのより洗練された方法はありますか?