Asp.net mvc 3 在ASP.NET MVC3的自定义授权属性中使用操作参数

Asp.net mvc 3 在ASP.NET MVC3的自定义授权属性中使用操作参数,asp.net-mvc-3,authorization,custom-attributes,Asp.net Mvc 3,Authorization,Custom Attributes,我有一个控制器,它应该只在加载特定参数时请求授权。例如,当参数ID为8时 我想到了使用如下自定义验证属性: public class MyAuthorizeAttribute : AuthorizeAttribute { protected override bool AuthorizeCore(HttpContextBase httpContext) { if (/* Action's inputparameter ID = 8 */) {

我有一个控制器,它应该只在加载特定参数时请求授权。例如,当参数ID为8时

我想到了使用如下自定义验证属性:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (/* Action's inputparameter ID = 8 */)
        {
        return base.AuthorizeCore(httpContext);
        }
        return true;
    }
}
我的行为看起来像这样(并不是说它有趣)

问题是您可以看到,我不知道如何检查authorize属性中的ID参数。
你能帮我一个解决办法吗?

你需要这样的东西

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        int? id = GetId(filterContext);

        if (id.HasValue)
        {
          ...
        }
    }

    private static int? GetId(ActionExecutingContext filterContext)
    {
        int? Id = null;

        if (filterContext.ActionParameters.ContainsKey("Id"))
        {
            Id = (int?)filterContext.ActionParameters["Id"];
        }
    }

如果id作为请求参数(GET或POST)或路由数据参数传递:

protected override bool AuthorizeCore(HttpContextBase httpContext)
{
    // first look at routedata then at request parameter:
    var id = (httpContext.Request.RequestContext.RouteData.Values["id"] as string) 
             ??
             (httpContext.Request["id"] as string);
    if (id == "8")
    {
        return base.AuthorizeCore(httpContext);
    }
    return true;
}

只要继承了
authorizationAttribute
,就可以从
AuthorizationContext
获取参数,如下所示:

公共类MyAuthorizeAttribute:AuthorizeAttribute
{
授权时的公共覆盖无效(AuthorizationContext filterContext)
{
字符串idParam=filterContext.Controller.ValueProvider.GetValue(“id”).AttemptedValue;
int-id;
if(内部锥虫(idParam,外部id))
{
if(id==8)//在这里应用您的业务逻辑
返回;
}
filterContext.Result=新的HttpUnauthorizedResult();
}
}
[我的授权]
受保护的公共操作结果(int id)
{
返回视图();
}
ValueProvider
将迭代所有注册的提供程序,默认情况下包括
RouteDataValueProvider
QueryStringValueProvider
FormValueProvider
,并为您完成所有工作


否则,我建议使用
actionfilteratAttribute

是的,类似的,但是我在AuthorizeCore方法中有一个HttpContextBase参数,而不是ActionExecutingContext。我不知道如何在OnActionExecuting方法中编写授权逻辑。这是一篇很好的文章,解释了如何访问ActionParameters进行授权:代码是多余的,请参阅下面的解决方案。@Darin,你能告诉我action的输入参数是否是一个模型吗,如何检索该模型对象而不是命名参数?听起来您实际上是在寻找它,但这并不能完全回答我的问题。我想根据
id
参数的值启用/禁用授权。是否有方法影响来自
OnAuthorization
处理程序的授权?你能详细说明一下你答案的
部分吗?@SoonDead,我改变了我的例子。正如你所看到的,它仍然很简单,但功能齐全。这与Darin Dimitrov的答案有什么不同?
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var rd = httpContext.Request.RequestContext.RouteData;
        string currentAction = rd.GetRequiredString("action");
        string actionparam =Convert.ToString(rd.Values["param"]);

        if (id == actionparam)
        {
            return base.AuthorizeCore(httpContext);
        }
return true;
 }
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var rd = httpContext.Request.RequestContext.RouteData;
        string currentAction = rd.GetRequiredString("action");
        string actionparam =Convert.ToString(rd.Values["param"]);

        if (id == actionparam)
        {
            return base.AuthorizeCore(httpContext);
        }
return true;
 }