【问题标题】:MVC middleware check attribute on controller method控制器方法上的 MVC 中间件检查属性
【发布时间】:2017-10-29 18:52:01
【问题描述】:

我正在使用 asp.net core mvc。在默认身份验证旁边,我添加了非常具体的授权,这是通过使用 ResultFilterAttribute 属性完成的。

将来,为了确保开发人员将为每个控制器方法指定权限,我想在执行操作之前检查是否为方法设置了属性。

是否可以在 MVC 中间件中完成。或者也许有更好的方法?

【问题讨论】:

  • 使用哪种过滤器类型? IE。你实现了哪个过滤器接口(如IActionFilter)?这个问题可能是stackoverflow.com/questions/44199347/…的重复
  • 也许覆盖ControllerFactory 会更好。我不确定,如果您在自定义中间件中有 MVC 上下文。

标签: c# asp.net-core asp.net-core-mvc


【解决方案1】:

感谢Christian 提及ControllerFactory。就我而言,这是正确的方法。

 public class MyControllerFactory : DefaultControllerFactory
    {
        public MyControllerFactory (IControllerActivator controllerActivator, IEnumerable<IControllerPropertyActivator> propertyActivators)
            : base(controllerActivator, propertyActivators)
        {

        }

        public override object CreateController(ControllerContext context)
        {
            var controllerActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor;
                var isDefined = controllerActionDescriptor.MethodInfo.GetCustomAttributes(inherit: true)
                    .Any(a => a.GetType().Equals(typeof(PermissionFilterAttribute)));
                if (!isDefined)
                {
                    throw new NotImplementedException();
                }

            return base.CreateController(context);
        }
    }

在 Startup.cs 解析 IControllerFactory 接口时需要告诉 mvc 使用 MyControllerFactory。

services.AddSingleton&lt;IControllerFactory, MyControllerFactory&gt;();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 2018-01-31
    相关资源
    最近更新 更多