如何使用动作过滤器更改输入参数

时间:2018-10-17 13:39:49

标签: c# linq asp.net-web-api action-filter

背景:

我正在尝试解决一个潜在的安全问题,以删除作为字符串参数插入到我的WebAPI方法中的单引号(这需要在整个应用程序中完成)。

我试图通过创建一个执行必要动作的动作过滤器来实现这一目标

public class ValidateActionParametersAttribute : ActionFilterAttribute, IActionFilter
    {
        public override void OnActionExecuting(HttpActionContext actionExecutedContext)
        {          
            var parameters = actionExecutedContext.ActionArguments;
            var parameterList = parameters.Values.ToList();
            parameterList.Where(x => x.GetType() == typeof(string)).ToList().ForEach(y => y = y.ToString().Replace("\'", ""));            
            base.OnActionExecuting(actionExecutedContext);
        }
    }

并在我的WebApiConfig中全局注册它

config.Filters.Add(new ValidateActionParametersAttribute());

但是当我在代码中放置断点后进行检查时,在ActionFilter中完成的参数更改似乎无法反映出来。有人可以指导我我在做什么错吗?

1 个答案:

答案 0 :(得分:1)

您不会更新自变量字典中的值,而只是替换传递给ForEach的lambda函数的y参数。

由于ActionArguments是字典,因此您可以进行以下操作:

var stringArgs = context.ActionArguments.Where(pair => pair.Value is string).ToList();

foreach (var keyValue in stringArgs)
{
    var safeValue = ((string)keyValue.Value).Replace("\'", "");
    context.ActionArguments[keyValue.Key] = safeValue;
}

这将获取所有为字符串的参数,并将其替换为安全版本。