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

本文关键字:方法 最佳 保护 net | 更新日期: 2023-09-27 17:57:16

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

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

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

  • 这是一个网络项目
  • 人们可能会从填充它开始,但在那一刻从未保存过它
  • 那个屏幕等待大约 30 分钟,让我们说
  • 会话已结束
  • 用户回到计算机前,单击"保存"按钮,但该过程不应完成

保存操作很容易成为DELETE操作或SELECT

由于有很多类型的表格和东西,我有BL.ItemManagerBL.VideoManagerBL.ServiceManager等等......因此,这些类中有很多保存,删除和选择方法。

因此,有没有一种巧妙的方法可以通过在运行进程之前检查会话来保护某些方法

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

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

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

[SessionAlive]
public void SomeMethod()

或者你可以只在 Global.asax 文件中使用Session_End方法,或者你可以只使用一些 javascript 代码来强制重定向到登录页面。

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

PostSharp和Castle DynamicProxy

之间最大的技术区别是PostSharp修改了你的IL代码,其中Castle DynamicProxy创建类的派生类型,并在运行时给你一个新的派生实例。这意味着,当你反编译使用PostSharp的代码时,你会看到一些其他代码不是用原始的C Sharp代码编写的。

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

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

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

动态代理是免费的,不像后期锐利。

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