sql-server - 出于什么设计原因,Asp.Net Core SessionKey 与 SessionId 不同?

标签 sql-server security session cookies asp.net-core-mvc

一些背景

在 asp.net core 中,当使用 SqlServer 存储 session 时,奇怪的是 SqlServer 表中的 Id 列被设置为 sessionKey 的值,这是一个 GuidSessionMiddleware 生成。我说的很奇怪,因为有一个 SessionId 但表中的 Id 没有设置为那个,它被设置为 SessionKey。 (这不是我编的)

用于表中IdsessionKey 也是加密后放置在 session 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 接口(interface)为 SessionId 提供了一个属性,但没有为 SessionKey 提供属性。因此,在代码中访问 SessionId 然后访问 SessionKey 通常要容易得多,例如,当您可以访问 HttpContext 对象时。

这使得很难将 session 与数据库记录相匹配(如果您希望这样做的话)。 stackoverflow 上的另一位用户以及 How to Determine Session ID when using SQL Sever session storage 也指出了这一点。

为什么?

我想知道的是为什么系统会这样设计?为什么 SessionIdSessionKey 不一样?为什么要使用两个不同的 Guids?我问是因为我正在创建我自己的 ISession 实现并且我很想在我的实现中使用 SessionKey 作为 SessionId 这样将数据库中的记录与 session 匹配起来会更容易。那会是个坏主意吗?为什么 DistributedSession 对象不以这种方式设计,而是生成一个不同于 SessionKeySessionId?我能想到的唯一原因可能是试图通过混淆数据库记录和它所属的 session 之间的链接来提高安全性。但总的来说,安全专家并不认为通过混淆来保护安全是有效的。所以我想知道为什么要实现这样的设计?

最佳答案

我还在 GitHub 上发布了这个问题 https://github.com/aspnet/Session/issues/151#issuecomment-287894321也尝试得到答案。

@Tracher 在那里回答了问题,所以我将他的回答粘贴在下面,这样它也可以在 stackoveflow 上找到。

生命周期不同。 session (和 SessionId)的真实生命周期由服务器控制。 SessionKey 存储在 cookie 中,并在客户端存在不确定的时间。如果 session 在服务器上过期,然后客户端使用旧的 SessionKey 发送新请求,则会创建一个具有新 SessionId 的新 session 实例,但使用旧的 SessionKey 进行存储,这样我们就不必发出新的 cookie。

换句话说,不要依赖你无法控制的事情。客户端可以无限期地保留和重播他们的 SessionKey,但它是服务器决定是否真的仍然是同一个 session 。

关于sql-server - 出于什么设计原因,Asp.Net Core SessionKey 与 SessionId 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42590026/

相关文章:

sql-server - 动态 SQL 查询以查找表中所有列的缺失值计数

security - 网站编程漏洞 list

java - 如何给不同的Java类赋予不同的权限?

node.js - Sqlite 如何对值进行转义以防止 SQL 注入(inject)

ruby-on-rails - 如果空闲,Rails Protect_from_forgery 会破坏登录表单

session - Node.js,具有无限循环的 session

php - 如何阻止用户在已经登录的情况下访问登录页面?

sql-server - SQL Server 2008 中的 bigint 算术溢出

sql-server - 如何压缩 Liquibase 文件以反射(reflect)当前数据库状态

sql - 如何根据另一个sp的多次输出执行一个sp多次