3

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

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

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

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

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

由于表格和东西的类型很多,我有BL.ItemManager,,BL.VideoManager等等BL.ServiceManager......所以,这些类中有很多保存,删除和选择方法。

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

4

4 回答 4

3

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

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

[SessionAlive]
public void SomeMethod()

或者您可以只使用Session_EndGlobal.asax 文件中的方法,或者您可以只使用一些 javascript 代码来强制重定向到登录页面

于 2013-02-04T09:07:44.697 回答
1

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

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

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

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

于 2013-02-04T09:20:31.127 回答
0

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

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

于 2013-02-04T09:11:08.263 回答
0

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

于 2013-02-06T18:32:30.433 回答