3

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

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

        return something....
    }

我需要根据 profiledto 对象内部的一些属性进行身份验证。

我想知道如何从 AuthorizationContext 中获取我的过滤器中的这个对象。

4

4 回答 4

4

我是这样做的:

var parameters = filterContext.ActionDescriptor.GetParameters();
var values = parameters.Select(s => new 
             {
                 Name = s.ParameterName,
                 Value = filterContext.HttpContext.Request[s.ParameterName]
             });
于 2013-10-11T09:03:21.680 回答
2

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

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
   }
}
于 2013-07-14T15:52:17.947 回答
2

ASP.NET 核心

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");
于 2017-09-26T14:07:27.167 回答
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。

于 2017-12-12T15:05:24.530 回答