我们正在使用 Autofac 的 IAutofacAuthorizationFilter 构建授权过滤器,我们已经在启动时向基本控制器注册了此过滤器。所有控制器都继承自我们的基本控制器。我们在执行过程中要求确定目标控制器是否已向CustomAuthFilter注册。我尝试使用反射来检查控制器是否注册了自定义身份验证过滤器,但我无法获得。他们是否有更好的方法来检查控制器是否已注册到自定义身份验证过滤器。
builder.RegisterType<CustomAuthFilter>()
.Named<IAutofacAuthorizationFilter>("CustomAuthFilter")
.WithParameters(new[]
{
new ResolvedParameter((pi, ctx) => pi.ParameterType == typeof(Logger),
(pi, ctx) => ctx.Resolve<Logger>()),
new ResolvedParameter((pi, ctx) => pi.ParameterType == typeof(Reader),
(pi, ctx) => ctx.Resolve<Reader>())
}
).AsWebApiAuthorizationFilterFor<ControllerBaseAPI>()
.InstancePerRequest();
此方法使用RegisterBuildCallback
事件来筛选注册。它还使用反射,因为元数据类型在编译时不存在,或者我找不到。您可能需要花费一些时间来优化选择,但这是信息存储在容器中的位置。
builder.RegisterBuildCallback(builtContainer =>
{
//Contains all controller registered with AutofacWebApiAuthorizationFilter
var registeredWithFilter = builtContainer.ComponentRegistry.Registrations.SelectMany(x => x.Metadata).Where(x => x.Key.Equals("AutofacWebApiAuthorizationFilter"))
.Select(x => x.Value).Select(x => x.GetType().GetProperty("ControllerType").GetValue(x))
.Select(x => x.GetType().GetProperty("Name").GetValue(x));
});