【问题标题】:How to pass method parameter into method's attribute value?如何将方法参数传递给方法的属性值?
【发布时间】:2014-03-22 10:12:37
【问题描述】:

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

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

有没有办法将ViewTransactionaccoutId参数传递给ClaimsPrincipalPermission Operation

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

【问题讨论】:

  • 如果 accountId 作为参数传递到您的 ViewTransaction 方法(这意味着 accountId 必须存在于其他地方),为什么不能以相同的方式将其传递到您的属性中?
  • 因为我调用 ViewTransaction(accountId)。 “以同样的方式通过”是什么意思?
  • 我的意思是你不能在你的属性中调用 accountId 作为参数,类似于你对 ViewTransaction 方法的处理方式吗?
  • 很抱歉,您是在问我问题吗? ViewTransaction() 的 accountId 由最终用户输入。我想在涉及 ViewTransaction 的实际代码之前将它传递给属性。

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


【解决方案1】:

属性在编译时需要常量值。因此,您不能将动态值传递给您的属性并期望它能够编译。您必须进行一些反思才能让它做您想做的事情。

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?

【讨论】:

  • 我可以看到,如果我尝试这种方式,我必须在具有上述代码的 SomeMethod() 中调用 ViewTransaction。这不是我想做的。所以我认为没有选择,对吧?
  • 不,没有其他方法可以真正做你想做的事。听起来您可能需要考虑将此功能子类化,而不是将其放在属性中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 2011-07-18
  • 2021-02-05
  • 1970-01-01
  • 2013-05-18
相关资源
最近更新 更多