如何扩展ASP.NET MVC AuthorizeAttribute

时间:2010-09-16 12:13:05

标签: asp.net asp.net-mvc

我正在使用asp.net会员提供程序来验证用户。我有另一个表,其中包含链接到我的aspnet_users表的其他用户详细信息。

当用户登录我的网站时,我将我称之为“UserProfile”的内容放入会话变量中,我需要检查控制器中每次调用时是否存在此Session变量(登录页面后面的所有控制器)。

所以我的问题是:

我编写了一个ActionFilter,它继承了AuthorizeAttribute,它调用默认的base.AuthorizeCore()方法并检查是否存在我的Session对象(Session [“UserProfile”]),我还创建了一个基本控制器,保存我的UserProfile类型的对象,所有适当的控制器类都继承自该对象,因此他们可以访问我的UserProfile。 如何在ActionFilter中使用my方法将此UserProfile属性设置为控制器中的Session变量?

2 个答案:

答案 0 :(得分:0)

为什么不能简单地在基本控制器中执行此操作?这似乎是填充物业的正确位置。执行自定义授权属性将创建不需要存在的依赖项,从而导致更复杂。我所说的是在会话中检查密钥是否存在,虽然相关,但与填充属性不同。事实上,如果您最终决定在会话中仅存储数据库密钥并且每次都从数据库中检索更复杂的配置文件对象,那么它可能会非常不同。另请注意,authorize属性以后可以简单地应用于方法而不是类 - 此时,您可能会多次执行属性的填充。

但是,如果您认为必须传递给属性的OnAuthorization方法的AuthorizationContext包含对控制器的引用。您可以将其转换为基本控制器(使用as语法并检查无效),然后直接访问属性(如果是公共的)或通过反射(如果没有)。

答案 1 :(得分:0)

与tvanfosson相同,不要向控制器库添加属性,这取决于所应用的ActionFilter。

另一种方法是将代码移动到一个单独的类,该类检索/检查对所述属性的访问。 ActionFilter和控制器库都使用所述类来检索值。 依赖是明确的,这使得其他开发人员更容易理解