.net - 这种 ASP.NET session 访问多用户安全技术吗?

标签 .net asp.net session thread-safety

我正在研究一种设计模式,该模式已出现在我公司的很多项目中。它在历史上一直运行正常,但是我听到其他一些开发人员认为使用这种模式可能会导致 session 损坏。我正在 Stack Overflow 上寻找其他 .NET 开发人员的见解。

基本上,有一个类(通常是 static 或 Singleton 模式,主要取决于编写它的开发人员)存储在 App_Code 中。

此类通过属性封装对当前 session 的访问。所有这些属性都采用以下形式:

public static class SessionHelper
{
    public static string SessionValue
    {
        get
        {
            object o = HttpContext.Current.Session["sessionValueName"];
            if (o == null)
            {
                // Replace the following with code to store & retrieve
                // a default value of the appropriate datatype.
                o = string.Empty;
                HttpContext.Current.Session["sessionValueName"] = o;
            }

            return o.ToString(); // or cast, ensure cast is valid & return.
        }
        set
        {
            HttpContext.Current.Session["sessionValueName"] = value;
        }
    }

    // Other properties, strongly-typed, as above.
}

(当类是单例时,这些不是静态的。)

我过去曾在网站上看到过静态数据的问题,主要是因为静态数据用于维护每个 session 的状态。 (例如,我看到过静态声明的“每用户”代码隐藏成员。不是我的代码;我的团队是编写该困惑的公司的清理人员。)

但是,因为这只是 HttpContext.Current.Session 的静态条目,所以看起来它应该是安全的,因为它与 Page 本质上没有任何不同> 类将其封装在 Session 属性中。正如我所说,我公司使用过的其他网站都没有遇到任何问题,其中包括一些相当大且高度活跃的用户群。但我只是想获得一个新的视角。

是否存在潜在的多用户问题、竞争条件或其他故障/缺陷,特别可能导致上述模式中的 session 损坏?

最佳答案

我使用的方法与您提供的方法非常相似,到目前为止尚未发现任何问题。

也许需要关心的一件事是硬编码的 session key :您永远无法确定同一 key 在另一个位置没有用于不同的目的。

这就是为什么我只依赖一个 key ,用于在 ASP.NET session 中存储“我的 session ”。然后,所有 session 数据都将实现为“我的 session ”对象的普通属性。


这是我的方法:

public class MySession
{
    // private constructor
    private MySession() {}

    // Gets the current session.
    public static MySession Current
    {
      get
      {
        MySession session =
          (MySession)HttpContext.Current.Session["__MySession__"];
        if (session == null)
        {
          session = new MySession();
          HttpContext.Current.Session["__MySession__"] = session;
        }
        return session;
      }
    }

    // **** add your session properties here, e.g like this:
    public string Property1 { get; set; }
    public DateTime MyDate { get; set; }
    public int LoginId { get; set; }
}

该类在 ASP.NET session 中存储其自身的一个实例,并允许您从任何类以类型安全的方式访问 session 属性,例如:

int loginId = MySession.Current.LoginId;

string property1 = MySession.Current.Property1;
MySession.Current.Property1 = newValue;

DateTime myDate = MySession.Current.MyDate;
MySession.Current.MyDate = DateTime.Now;

这种方法有几个优点:

  • 它可以让您免于进行大量的类型转换
  • 您不必在整个应用程序中使用硬编码的 session key (例如 Session["loginId"]
  • 您可以通过在 MySession 的属性上添加 XML 文档注释来记录您的 session 项

关于.net - 这种 ASP.NET session 访问多用户安全技术吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2413432/

相关文章:

.net - .NET 的测试自动化工具

ASP.Net 下拉菜单总是在按钮单击事件上返回第一个值

java - java中如何使 session 过期?

c# - 尝试了解 Azure 服务总线 session

.net - AWS 中的 SQL Server CLR 存储过程

c# - 通用类型作为字典键的类型不起作用

c# - SelectedIndexChanged 事件未针对 1 个列表项触发

javascript - 应用程序洞察记录查看的列表项?

java - Spring MVC 和 Freemarker/Velocity

c# - 在单独的线程上引发事件