【问题标题】: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));
    

    【讨论】:

      猜你喜欢
      • 2020-04-15
      • 2018-12-20
      • 2019-04-03
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      相关资源
      最近更新 更多