从Autofac AsWebApiAuthenticationFilterFor中排除特定方法

时间:2018-10-05 12:52:35

标签: asp.net-web-api autofac

我正在尝试为所有控制器上存在的一个名为Ping的健康终结点,对WebApi2控制器 中的所有方法添加身份验证。我的身份验证正常运行,但是我看不到应用排除的方法。

我想做类似下面的Exclude()的事情:

      builder.Register(e => new MyCustomAuthFilter(
      e.Resolve<IInjectedService>(),
      e.Resolve<IAnotherService>()))
      .AsWebApiAuthenticationFilterFor<MyController>()
      .Exclude(Ping)
      .InstancePerRequest();
      builder.RegisterWebApiFilterProvider(config);

1 个答案:

答案 0 :(得分:1)

不幸的是,目前没有针对每个项目的退出。您基本上可以附加到整个控制器或单个动作,但是仅此而已。

有一个long running issue,人们希望将单个过滤器注册附加到多个控制器的功能。我提出这一点是因为这也意味着您不能仅仅这样做:

// Doesn't work, this isn't a thing
builder.RegisterType<Filter>()
       .AsWebApiAuthenticationFilterFor<Controller>(c => c.Get())
       .AsWebApiAuthenticationFilterFor<Controller>(c => c.Post());

也就是说,就目前的情况而言,您无法就希望采用的方法进行讨论,而仅能完成这项工作。

还有一个long-running issue允许通过谓词附加过滤器。如果实现了,则可以执行以下操作:

// Doesn't work, this isn't a thing
builder.RegisterType<Filter>()
       .AsWebApiAuthenticationFilterFor<Controller>(method => method.Name != "Delete");

不幸的是,还有很多工作要做,因此,如果没有社区in the form of PRs or some additional project owners的帮助,您可能很快就会看不到这些。

我能为您提供的最好的选择是将您的控制器分为两个不同的类-您要在一个控制器中覆盖的方法,而不是在另一个控制器中覆盖的方法。从通用基类派生两者以共享逻辑。