每当在 Controller/Method 上使用 AuthorizeAttribute 时执行过滤器
Execute filter whenever AuthorizeAttribute is used on a Controller/Method
所以我们有一堆 API 控制器使用 [Authorize]
属性,我希望能够在使用该属性的任何地方执行过滤器(记录内容)。
我们有这个 Ninject 和下面的代码片段,但我们正试图从 Ninject(到 Autofac)
kernel.BindHttpFilter<AuthLogFilter>(FilterScope.Action)
.WhenActionMethodHas<AuthorizeAttribute>()
.InSingletonScope();
AuthLogFilter 的精简版本类似于:
public class AuthLogFilter : IActionFilter
{
private readonly ILog _log;
public AuthLogFilter(ILog log)
{
_log = log;
}
public async Task<HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
{
ClaimsPrincipal principal = actionContext.RequestContext.Principal as ClaimsPrincipal;
_log.Info("log some stuff about the principal");
}
}
如何使用本机过滤器执行此操作?或者使用 Autofac。
我能找到的唯一解决方案是以编程方式检查过滤器的 OnActionExecuting
中的过滤器,如下所述 -
所以我们有一堆 API 控制器使用 [Authorize]
属性,我希望能够在使用该属性的任何地方执行过滤器(记录内容)。
我们有这个 Ninject 和下面的代码片段,但我们正试图从 Ninject(到 Autofac)
kernel.BindHttpFilter<AuthLogFilter>(FilterScope.Action)
.WhenActionMethodHas<AuthorizeAttribute>()
.InSingletonScope();
AuthLogFilter 的精简版本类似于:
public class AuthLogFilter : IActionFilter
{
private readonly ILog _log;
public AuthLogFilter(ILog log)
{
_log = log;
}
public async Task<HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
{
ClaimsPrincipal principal = actionContext.RequestContext.Principal as ClaimsPrincipal;
_log.Info("log some stuff about the principal");
}
}
如何使用本机过滤器执行此操作?或者使用 Autofac。
我能找到的唯一解决方案是以编程方式检查过滤器的 OnActionExecuting
中的过滤器,如下所述 -