【问题标题】:.net C#, what is the best practice for securing every method?.net C#,保护每种方法的最佳实践是什么?
【发布时间】:2013-01-18 22:49:00
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: c# asp.net security session


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 非常感谢您的意见。我马上检查你的代码
      【解决方案3】:

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

      Dynamic Proxy 是免费的,不像 postsharp。

      【讨论】:

        【解决方案4】:

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

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

        [SessionAlive]
        public void SomeMethod()
        

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

        【讨论】:

        • 谢谢。这看起来很有希望。
        猜你喜欢
        • 2011-12-29
        • 2020-09-26
        • 1970-01-01
        • 1970-01-01
        • 2021-04-10
        • 2010-09-05
        • 2017-11-16
        • 2011-01-17
        • 1970-01-01
        相关资源
        最近更新 更多