.net C#,保护每种方法的最佳做法是什么?

时间:2013-02-04 08:58:46

标签: c# asp.net security session

我有一个Web项目,它有一个处理一些数据操作的业务层。我想通过在执行方法之前检查是否存在活动的未结束有效Session来保护一些或所有方法。

我首先想到使用Attribute而不是类,但我无法正常运行它。由于该类是通常的类而不是从System.Web.Page派生的。调用所需的BL实例时,属性类永远不会运行。此外,某些方法可能不需要有效的会话,因此整个类可能不需要完整的安全性。而且,在方法的每个开头添加一个检查会话的行听起来并不是很有希望。

如果你问我为什么需要通过方法保护,我可以这样解释:

  • 这是一个网络项目
  • 人可能会从填充它开始,但从那时起就没有得到它
  • 该屏幕等待约30分钟让我们说
  • 会话已结束
  • 用户返回计算机前,点击保存按钮,但不应完成处理

保存操作很容易就是DELETE操作或SELECT

由于表格和内容有很多种,我有BL.ItemManagerBL.VideoManagerBL.ServiceManager等等...所以,有很多保存,删除和选择方法在这些课程中。

因此,通过在运行进程之前检查会话来保护某些方法是否有一种简洁的方法

4 个答案:

答案 0 :(得分:3)

您可以使用面向方面的方法; PostSharp可能是一种选择。

您需要做的就是使用PostSharp创建一个属性,以便在方法调用之前注入代码以检查会话是否处于活动状态。喜欢的东西;

[SessionAlive]
public void SomeMethod()

或者您可以在Global.asax文件中使用Session_End方法,或者您可以使用一些javascript代码force redirection to login page

答案 1 :(得分:1)

AOP是满足您需求的绝佳技术。您可以使用PostSharp和Castle的DynamicProxy。这些框架允许您拦截方法调用,您可以在拦截器中进行安全检查。

PostSharp和Castle DynamicProxy之间最大的技术差异是PostSharp会修改您的IL代码,其中Castle DynamicProxy会创建类的派生类型,并为您提供在运行时派生的新实例。这意味着,当您对使用PostSharp的代码进行反编译时,您会看到一些其他代码未使用原始C Sharp代码编写。

如果选择DynamicProxy方法,则应通过工厂实例化类,但如果您更喜欢PostSharp,则可以直接使用类。您只需添加一些属性即可。另一方面,PostSharp不是免费的。

最后,您可以自己实现DynamicProxy。 Here是我写的一个简单的DynamicProxy生成器。您可以在方法调用之前/之后处理错误事件。这只是一个示例代码,如果您打算在重要的应用程序中使用它,您应该更喜欢Castle。

答案 2 :(得分:0)

另一种可能性是使用Castle Dynamic代理 - 用它包装您的服务。动态代理允许您拦截方法调用并使用一些通用行为包装它们 - 您只能截取所需的特定方法,并添加会话检查。

与postsharp不同,动态代理是免费的。

答案 3 :(得分:0)

AOP绝对是实现这一目标的方法。除了在其他答案中已经提出的通用AOP框架之外,您可能有兴趣知道.NET框架包含用于此类安全性验证的AOP机制。要使用它,只需创建(并使用)继承自CodeAccessSecurityAttribute的属性,以及可用于验证会话有效性的IPermission实现。