【问题标题】:Cookie's key stored in memory, can't switch servercookie的key保存在内存中,不能切换服务器
【发布时间】:2016-10-20 03:59:26
【问题描述】:

我有一个 Asp.Net Core RC2 应用程序,但我遇到了 cookie 身份验证问题。在 startup.cs 文件中,我有一个基本配置:

app.UseIdentity();
app.UseCookieAuthentication();

我没有使用 EntityFramework,因为我使用的是文档数据库,为此我实现了 Identity 的接口 IUserStore 和 IRoleStore。

当我登录 localhost 进行调试时,即使我设置了持久性 cookie,它们仍然有效,直到我关闭应用程序。当我重新启动它时,cookie 已过期,服务器将我重定向到登录页面。这说明 cookie 的密钥保存在内存中。为什么它不在数据库上的用户个人资料记录中保留密钥? Cookie 一直有效,直到应用程序保持活动状态。

当我在生产服务器上部署应用程序时,这是一个问题。我正在使用生产/登台解决方案,并且我注意到当我在登台上部署应用程序并切换服务器时,所有登录用户的会话都会过期。这是一个大问题。正如https://docs.asp.net/en/latest/security/data-protection/compatibility/cookie-sharing.html 所建议的那样,我也无法在本地目录上共享cookie 密钥,因为两台服务器不同。我该如何解决?

【问题讨论】:

  • 您是否担心迁移到新机器时人们会被注销?为什么?
  • 因为敏捷开发我也可以像每天一样切换机器
  • 你有什么理由不能使用分布式内存缓存,比如redis? redis 支持随 ASP.NET Core 开箱即用,您只需要一个 redis 集群并将包添加到您的应用程序并调用 AddRedisCache() 方法 Startup 类,在您的授权中间件注册之前的某个地方?这使您的应用程序将它们的值存储在 Redis 中,而不是默认的 InMemoryCache
  • 我从未使用过 Redis。我会仔细看看的。是否存在任何其他不暗示新的外部工具设置的解决方案?
  • 查看内置缓存提供程序的 ASP.NET Core 缓存存储库。 github.com/aspnet/Caching/tree/dev/src。还有一个 SqlServer 缓存选项。查看示例文件夹github.com/aspnet/Caching/tree/dev/samples。 Redis 是分布式系统最自然的选择,它是一个分布式内存数据库

标签: cookies asp.net-core asp.net-identity session-cookies


【解决方案1】:

我认为问题在于您需要在多台机器上使用相同的数据保护密钥,而 documentation 表示默认设置适用于单台机器

因此,解决方案是控制密钥的存储位置,以便您可以将密钥与您的应用程序一起部署到每个服务器。我还需要在我的应用程序中执行此操作,因为我正在使用数据保护来加密数据库中的一些内容,例如社交身份验证秘密,并且如果应用程序迁移到另一台机器,我需要能够解密这些内容。

我确实在启动时像这样更改了我的应用程序中的关键位置:

string pathToCryptoKeys = appBasePath + System.IO.Path.DirectorySeparatorChar + "dp_keys" + System.IO.Path.DirectorySeparatorChar;
services.AddDataProtection()
            .PersistKeysToFileSystem(new System.IO.DirectoryInfo(pathToCryptoKeys));

但是保持这些密钥的安全非常重要,因此在考虑将它们存储在哪里以及谁可以访问该位置时应该非常小心,像我的示例中那样将它们放在 approot 之下可能不是最好的解决方案

【讨论】:

    猜你喜欢
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2014-05-22
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多