【发布时间】:2014-08-21 00:27:55
【问题描述】:
背景:
我想使用使用 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
{
}
谢谢!
【问题讨论】:
-
(1) 如果您(暂时)不使用 Ninject,它会起作用吗? (2) 如果您使用授权过滤器,它是否有效? (3) 可能值得一看this SO question。
标签: c# asp.net authentication asp.net-web-api2 action-filter