背景:

我想使用使用Ninject注入的IAuthenticationFilter实现对Web API的POST请求进行身份验证。要验证请求,我需要访问请求正文。

问题:

我通常用来访问请求有效负载的ActionContext.ActionArguments在尝试在过滤器内部访问时为空。

题:


如何在IAuthenticationFilter实现中访问POST请求有效负载?
为什么ActionContext.ActionArgumentsIAuthenticationFilter实现内部为空,但是如果我的过滤器实现ActionFilterAttribute却具有值?


码:

过滤器实现:

public class AuthenticateFilter : IAuthenticationFilter
{
    private const string AuthenticationHeader = "X-Auth-Token";
    private const string UserHeader = "X-Auth-User";

    private readonly ILog log;

    public AuthenticateFilter(ILog log)
    {
        this.log = log;
    }

    public Task AuthenticateAsync(HttpAuthenticationContext context,
                                  CancellationToken cancellationToken)
    {
        // context.ActionContext.ActionArguments is empty

        if (!IsAuthenticated(context))
        {
            context.ErrorResult =
                new StatusCodeResult(HttpStatusCode.Unauthorized,
                                     context.Request);
        }

        return Task.FromResult(0);
    }

    public Task ChallengeAsync(HttpAuthenticationChallengeContext context,
                               CancellationToken cancellationToken)
    {
        context.Result =
            new StatusCodeResult(HttpStatusCode.Unauthorized,
                                 context.Request);

        return Task.FromResult(0);
    }

    private bool IsAuthenticated(HttpAuthenticationContext context)
    {
        // Authentication code here
        // context.ActionContext.ActionArguments is empty
    }
}


当控制器方法具有属性时,使用Ninject注入过滤器。

kernel.BindHttpFilter<AuthenticateFilter>(FilterScope.Action)
      .WhenActionMethodHas<AuthenticateAttribute>();


AuthenticateAttribute是空的ActionFilterAttribute

public class AuthenticateAttribute : ActionFilterAttribute
{

}


谢谢!

最佳答案

这是预期的行为。 AuthenticationAuthorization筛选器在ModelBinding / Formatter反序列化阶段之前运行,而Action筛选器在此阶段之后运行。

07-27 20:22