我使用自定义AuthAttribute来确定用户是否可以访问控制器和/或操作。问题是我必须在正在装饰的类中已存在的属性中复制信息和EFx连接。
我的问题是,是否有办法从自定义AuthAttribute访问装饰类中的字段?我试图避免不得不以提供单点访问的方式重新构建软件,因为这会打开不同的蠕虫病毒。
答案 0 :(得分:0)
我相信我找到了 的答案。我欢迎对此解决方案的所有评论。
不是让属性获得对它所装饰的控制器上的属性和字段的访问权限,而是可以通过公共HttpContext对象以线程安全的方式在它们之间共享它们之间的值。因此,如果您像我一样极端并且正在尝试在authattribute和adorned controller操作中减少对数据库的重复调用,那么将结果向前传递。这意味着首先会调用authattribute,你可以将检索到的值存储在" Items"传递给AuthorizeCore(..)方法的HttpContext对象的集合。然后,您可以通过控制器中的HttpContext对象以THREAD-SAFE方式检索相同的值。
在AuthAttribute的AuthorizeCore(..)覆盖中保存值的示例:
httpContext.Items.Add("fester", "bester");
在后续调用Controller / Action中检索值的示例:
this.HttpContext.ApplicationInstance.Context.Items["fester"];
我必须警告你,这只是一种似乎可以在简单测试中使用的可能实现。就个人而言,感觉就像一个黑客,必须有一个更好的方式。我还要说这是为了追求可疑的性能优势。它应该通过缓存HttpContext中的检索数据来减少数据库和/或网络调用的数量,这样您就不必在authattribute和装饰的Controller / Action中重复调用。如果你没有一个网站收到大量的电话,那么我会警告你不要这样做。
我希望有人在这个页面上推荐更好的东西。我将密切关注它在我的网站上是如何工作的,并且让所有人都知道它是否具有行为且真正是线程安全的。