2011-12-09 61 views
4

我正在为mvc3应用程序实现用户权限管理。在自定义属性中查找mvc3操作方法参数

我已经定义与ControllerName,ActionName数据库我的操作方法和参数包括参数名称和参数类型等

我实现了从授权属性继承自定义属性。

我想要做的是找到在数据库中定义的内置操作之间执行的操作,并计算用户是否具有指定操作的权限。

代码是这样的;

[HttpPost] 
[MyAuthorize] 
public ActionResult Edit(VendorPageItem entity) 
{ 
    //... 
} 

public class MyAuthorize: System.Web.Mvc.AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     if (httpContext == null) 
      throw new ArgumentNullException("httpContext"); 

     string controller = httpContext.Request.RequestContext.RouteData.Values["controller"].ToString(); 
     string action = httpContext.Request.RequestContext.RouteData.Values["action"].ToString(); 
     int userId = SessionState.Current.LoginParameter.VendorUserID; 

     List<string> parameterTypes = new List<string>(); 
     //TODO: Find out action method parameter types. 

     return IoCWorker.Resolve<IUserRightService>().HasUserRightToAction(userId, controller, action, parameterTypes); 
    } 
} 

我的问题是在我的自定义属性中找到方法参数类型。

谢谢。

编辑:忘记提及,这是后行动。 [HttpPost]加入。

+0

我已经用'AuthorizeAttribute'这种方法玩过,但是发现只是在控制器方法中检查权限更简单。 –

回答

2

我认为反思就是这里的答案。

一旦拥有控制器和操作,并且假设您事先知道命名空间,则可以检查控制器Type并深入查看其方法和相关签名/重载。

除了控制器和动作之外,还要检查RouteData的全部内容,可以告诉您传递给该方法的内容。

我还没有尝试过,但从你说的看来它会以这种方式工作。

+1

我有“控制器”文件夹下的“定义”,“管理”,“共享”等文件夹。所以命名空间是不同的。 我尝试在AuthorizeCore方法中浏览httpContext,以找到操作参数信息,但没有运气。 – berdem

1

我不确定我是否正确理解您的问题。如果你尝试访问参数值,我有一个答案,如果你真的想知道参数类型,那么@Matteo Mosca的答案将是正确的:

这取决于参数来自哪里。无论它们是QueryString参数还是表单参数或Cookie或...

ASP.NET的模型联编程序基础结构尝试映射操作方法上的参数。在您的自定义语句中,您可以使用上下文访问参数,例如

string input = httpContext.Request.Form["myInput"] 

编辑: 这当然不是最好的解决方案,因为您需要关于发布参数的信息。由于我不知道你的真实需求,所以我不能提出更好的建议。当然,你可以遍历Form集合。

可能性可能是您将该字段的名称作为MyAuthorizeAttribute的参数/属性传递。

+1

我的操作方法是一个后aciton,我使用jquery后。所以我没有查询字符串:(。 – berdem

+0

好,但你可以用同样的方式访问Forms集合。我还不确定它是否适用于AJAX请求。 – slfan

+1

我可以得到表单集合,但是我在它看到的形式控制键和值。例如:作为密钥ModelName.Entity.Name及其值。 但我没有“VendorPageItem”类型的表单集合。 – berdem

相关问题