我希望重用我当前定义的控制器/操作授权属性,这些属性指定用户访问角色以显示菜单项(因此用户只能看到他们有权访问的菜单项)。
目前菜单项的显示和控制器/动作授权属性角色是不同的,因此任何更改都需要在两个地方更新,这可能在未来容易出错。
我一直在研究自定义授权属性,这就是我目前所拥有的:
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 所需的角色。
据我所知,我可能需要一个详尽的列表,列出所有控制器操作和相关的用户角色,以便在这两个领域重用,有没有更优雅的方法来实现这一点?