如何将方法参数传递给方法的属性值?

时间:2014-02-21 04:23:15

标签: c# security reflection attributes claims-based-identity

我有一个用ClaimsPrincipalPermissionAttribute修饰的方法,如下所示:

[ClaimsPrincipalPermission(SecurityAction.Demand, 
                           Resource = "User", 
                           Operation = "accountId")]
IList<Transaction> ViewTransaction(int accountId)
{
     // some code
}

是否有将 ViewTransaction accoutId参数传递给 ClaimsPrincipalPermission Operation

我想要的是使用 accountId ,然后在ClaimsAuthorizationManager中实现自定义逻辑。

1 个答案:

答案 0 :(得分:3)

属性在编译时期望值为常量。因此,您无法将动态值传递给属性并期望它进行编译。你不得不采取一些反思来让它做你想做的事。

var method = typeof(YourClassType).GetMethod("ViewTransaction");
var attribute = method.GetCustomAttribute(typeof(ClaimsPrincipalPermission)) as ClaimsPrincipalPermission;
attribute.AccountId = 1234;

您需要为您的属性公开另一个属性,即AccountId 对于这种类型的方法显然存在一些担忧,在进行此操作之前应该进行大量权衡。确保您必须将此类信息传递给您的属性。

或者,如果您的方法位于MVC控制器内部,则可以从过滤器上下文中访问值提供程序,如本答案中所述。

ASP MVC C#: Is it possible to pass dynamic values into an attribute?