【发布时间】:2021-05-20 21:00:29
【问题描述】:
一些背景
在 asp.net core 中使用 SqlServer 存储会话时,奇怪的是 SqlServer 表中的Id 列被设置为sessionKey 的值,这是由SessionMiddleware 生成的Guid。我说的很奇怪,因为有一个SessionId,但表中的Id 没有设置为那个,它设置为SessionKey。 (不是我编的)
用于表中Id 的sessionKey 也是加密并放置在会话cookie 中的值。这是SessionMiddleware的代码:
var guidBytes = new byte[16];
CryptoRandom.GetBytes(guidBytes);
sessionKey = new Guid(guidBytes).ToString();
cookieValue = CookieProtection.Protect(_dataProtector, sessionKey);
var establisher = new SessionEstablisher(context, cookieValue, _options);
tryEstablishSession = establisher.TryEstablishSession;
isNewSessionKey = true;
然而,SessionId 是由以下代码行中的DistributedSession object 生成的Guid:
_sessionId = new Guid(IdBytes).ToString();
有趣的是,ISession 接口为SessionId 提供了一个属性,但没有为SessionKey 提供一个属性。因此,在代码中访问 SessionId 和 SessionKey 通常要容易得多,例如当您可以访问 HttpContext 对象时。
如果您愿意,这使得很难将会话与数据库记录匹配。 stackoverflow 上的另一位用户也注意到了这一点 How to Determine Session ID when using SQL Sever session storage。
为什么?
我想知道为什么系统会这样设计?为什么SessionId 和SessionKey 不一样?为什么要使用两个不同的Guids?我问是因为我正在创建自己的ISession 实现,并且我很想在我的实现中使用SessionKey 作为SessionId,以便更容易将数据库中的记录与会话匹配。那会是个坏主意吗?为什么不想DistributedSession 对象以这种方式设计,而不是生成与SessionKey 不同的SessionId?我能想到的唯一原因可能是试图通过混淆数据库记录与其所属会话之间的链接来提高安全性。但总的来说,安全专家并不认为通过混淆来实现安全是有效的。所以我想知道为什么要实施这样的设计?
【问题讨论】:
标签: sql-server security session cookies asp.net-core-mvc