如何在asp.net-mvc控制器中集中授权逻辑?

leo*_*ora 3 asp.net asp.net-mvc entitlements asp.net-mvc-4 asp.net-mvc-5

我有一个带有SQL Server后端的ASP.NET-MVC网站.我有许多控制器操作,要求我进行权利检查.

现在,我这样做:

    public ActionResult SomeEntitledPage()
    {
        if (_myModel.IsMySiteAdminRole)
        {
            return View(new MyViewModel());
        }
        else
        {
            return View("NotEntitled", new NotEntitledViewModel(){Page = "[PageName]", SupportDG = "support@support.com"});
        }
    }
Run Code Online (Sandbox Code Playgroud)

这工作正常,但感觉就像我在许多地方重复这个逻辑.

根据以下内容,将许多权利控制器操作"安全"的最佳方式(属性等)是什么?

(IsMySiteAdminRole如果没有权限,它可以检查并返回"未授权"视图.

我还想确保每个页面都没有性能损失?

Dav*_*ich 5

我更喜欢为Entitlement/Privilege逻辑使用动作过滤器.这些过滤器的优点是它们可以在动作方法填充模型运行.

例如:

public class AdminOnlyFilterAttribute : ActionFilterAttribute
{
      public override void OnActionExecuted(ActionExecutedContext filterContext)
      {
        if (!filterContext.Controller.ViewData.Model.IsMySiteAdminRole)
            {
                filterContext.Result = new ViewResult
                {
                    ViewName = "NotEntitled",
                    Model = new NotEntitledViewModel(){Page = "[PageName]", SupportDG = "support@support.com"}
                };
            }
        base.OnActionExecuted(filterContext);
    }   
}
Run Code Online (Sandbox Code Playgroud)

动作过滤器允许您有选择地覆盖Controller的OnActionExecuted方法.

此属性可以应用于特定操作或整个控制器.结果将取决于您的模型值,并将仅更改您的视图.