如何从AuthorizationContext获取MVC Action参数?

时间:2013-07-14 15:45:05

标签: asp.net-mvc custom-action-filter

我目前正在尝试编写自定义身份验证过滤器,我需要访问作为参数传递给我的过滤器中的操作的dto。让我们说我有这样的行动

[AuthenticateProfile]
public ActionResult EditProfile(ProfileDTO profileDto)
    {
        if (ModelState.IsValid)
        {
            // Do crazy stuff
        }

        return something....
    }

我需要根据profiledto object中的一些属性进行身份验证。

我想知道如何在AuthorizationContext的过滤器中获取此对象。

4 个答案:

答案 0 :(得分:4)

我是这样做的:

var parameters = filterContext.ActionDescriptor.GetParameters();
var values = parameters.Select(s => new 
             {
                 Name = s.ParameterName,
                 Value = filterContext.HttpContext.Request[s.ParameterName]
             });

答案 1 :(得分:2)

假设您的逻辑发生在OnActionExecuting(意味着在实际控制器操作运行之前),那么执行此操作的一种方法(如here所示)将是:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
   if (!filterContext.Controller.ViewData.ModelState.IsValid)
      return;

   var profileDto = filterContext.ActionParameters.SingleOrDefault(ap => ap.Key == "profileDto").Value;
   if (profileDto != null)
   {
      // do something with profileDto
   }
}

答案 2 :(得分:1)

ASP.NET Core

var parameters =
      filterContext
        .ActionDescriptor
        .Parameters
        .Select(s => new
        {
           Name = s.Name,
           Value = context.HttpContext.Request.Query[s.Name]
        });

扩展

public static StringValues? Parameter(this AuthorizationFilterContext context, string name)
{
     var parameter = context.ActionDescriptor.Parameters.FirstOrDefault(it => it.Name == name);
    if (parameter == null) return null;
     return context.HttpContext.Request.Query[parameter.Name];
}

使用

 var parameter = context.Parameter("id");

答案 3 :(得分:0)

以下是您尝试的一些示例:

public class AuthenticateProfileAttribute : AuthorizeAttribute {
    public override void OnAuthorization(AuthorizationContext filterContext) {
        // Looping through named parameters
        foreach (string name in filterContext.HttpContext.Request.QueryString.AllKeys) {
            var value = filterContext.HttpContext.Request.QueryString[name];
            // do something with the iteration
            Console.WriteLine(name + ": " + value);
        }

        // Looping through un-named parameters a.k.a route parameters
        foreach (KeyValuePair<string, object> parameter in filterContext.RouteData.Values) {
            var name = parameter.Key;
            var value = parameter.Value;
            // do something with the iteration
            Console.WriteLine(name + ": " + value);
        }

        // Get single named parameter
        string parameter = filterContext.HttpContext.Request.QueryString["parameter"];

        // Get single route parameter
        parameter = filterContext.RouteData.Values["parameter"].ToString();
    }
}

使用MVC 5.