【问题标题】:How to extract the session key from asp net core SessionMiddleware如何从asp net core SessionMiddleware中提取会话密钥
【发布时间】:2021-11-25 07:12:15
【问题描述】:
我正在开发一个项目,该项目使用 Redis 作为分布式缓存来存储我的会话数据。我的应用程序应该首先检查缓存是否有会话对象,如果没有,它应该从数据库中获取数据。
问题是我无法访问会话密钥本身,并且 SessionMiddleware 使用会话密钥作为 Redis 缓存中的密钥。
我想出了一些解决方案:
- 使用 Session.LoadAsync() 方法更新应用会话状态并检查 Session.Keys 是否保存一些数据。
- 找到一种方法来解密 cookie 会话,该会话与请求一起发送并从中获取密钥
- 为 SessionMiddleware 创建自定义修改并覆盖默认行为以提取关键会话
但如果有更好、更简单、更优雅的方式在应用程序中获取此会话密钥并在密钥会话存在时向 Redis 进行查询,我会徘徊。是否有一些服务、管理器等从传入请求中提取关键会话并使其可用?
【问题讨论】:
标签:
asp.net-core
session
.net-core
redis
session-cookies
【解决方案1】:
好的,我在这篇帖子 https://stackoverflow.com/a/40685514/12543959 中找到了“John-Luke Laue”提供的解决我的问题的方法。
重要!
解决方法没问题,但还是会报错:
An unhandled exception has occurred while executing the request.
System.Security.Cryptography.CryptographicException: The payload was invalid.
at Microsoft.AspNetCore.DataProtection.Managed.ManagedAuthenticatedEncryptor.Decrypt(ArraySegment`1 protectedPayload, ArraySegment`1 additionalAuthenticatedData)
at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.UnprotectCore(Byte[] protectedData, Boolean allowOperationsOnRevokedKeys, UnprotectStatus& status)
at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.DangerousUnprotect(Byte[] protectedData, Boolean ignoreRevocationErrors, Boolean& requiresMigration, Boolean& wasRevoked)
at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.Unprotect(Byte[] protectedData)
问题出在一处,变量目的的值,在 CreateProtector() 中需要作为字符串类型的参数:
var protectorPurpose = "whatever purpose you want";
_dataProtector = dataProtectionProvider.CreateProtector(protectorPurpose);
由于会话密钥的加密是在SessionMiddleware中进行的,所以正确的值应该是string类型的“SessionMiddleware”,代码应该是这样的:
_dataProtector = dataProtectionProvider.CreateProtector(nameof(SessionMiddleware));