背景:
我想使用使用Ninject注入的IAuthenticationFilter
实现对Web API的POST请求进行身份验证。要验证请求,我需要访问请求正文。
问题:
我通常用来访问请求有效负载的ActionContext.ActionArguments
在尝试在过滤器内部访问时为空。
题:
如何在IAuthenticationFilter
实现中访问POST请求有效负载?
为什么ActionContext.ActionArguments
在IAuthenticationFilter
实现内部为空,但是如果我的过滤器实现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
{
}
谢谢!
最佳答案
这是预期的行为。 Authentication
和Authorization
筛选器在ModelBinding / Formatter反序列化阶段之前运行,而Action
筛选器在此阶段之后运行。