首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActionContext.ActionArguments在IAuthenticationFilter中为空

ActionContext.ActionArguments在IAuthenticationFilter中为空
EN

Stack Overflow用户
提问于 2014-06-30 15:15:07
回答 2查看 3.2K关注 0票数 2

背景:

我想使用使用Ninject注入的IAuthenticationFilter实现对我的web进行POST请求的验证。要验证请求,我需要访问请求主体。

问题:

ActionContext.ActionArguments通常用于访问请求有效负载,当我试图在过滤器中访问它时,它是空的。

问题:

  1. 如何访问IAuthenticationFilter实现中的POST请求有效负载?
  2. 为什么ActionContext.ActionArgumentsIAuthenticationFilter实现中为空,但如果我的过滤器实现了ActionFilterAttribute,则会有值

代码:

过滤器实现:

代码语言:javascript
复制
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
    }
}

当控制器方法有一个属性时,过滤器就会被注入。

代码语言:javascript
复制
kernel.BindHttpFilter<AuthenticateFilter>(FilterScope.Action)
      .WhenActionMethodHas<AuthenticateAttribute>();

AuthenticateAttribute是一个空的ActionFilterAttribute

代码语言:javascript
复制
public class AuthenticateAttribute : ActionFilterAttribute
{

}

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-01 02:24:47

这是预期的行为。AuthenticationAuthorization过滤器在ModelBinding/格式化程序反序列化阶段之前运行,Action过滤器在这个阶段之后运行。

票数 2
EN

Stack Overflow用户

发布于 2015-01-10 04:59:31

我也遇到了同样的情况,如果它对任何人都有帮助,您需要使用反射和System.Web.Helpers的Json.Decode:

代码语言:javascript
复制
 public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
    {
        HttpRequestMessage request = context.Request;
        var content = request.Content.ReadAsAsync(typeof(Object)).Result.ToString();
        var methodInfo = ((ReflectedHttpActionDescriptor)request.Properties["MS_HttpActionDescriptor"]).MethodInfo; // get the method descriptor

        if (methodInfo.GetParameters().Any())  //this will get the parameter types
        {
             var parameterType = methodInfo.GetParameters().First().ParameterType; //you iterate can through the parameters if you need
             var casted = Json.Decode(content, parameterType);  //convert the json content into the previous type (your parameter)
             //do something with your populated object :)
        }

        return Task.FromResult(context.Request);
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24493425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档