gpt4 book ai didi

session - 在 ASP.NET Core MVC Identity 中部署 Docker 后自动注销

转载 作者:行者123 更新时间:2023-12-04 03:15:14 24 4
gpt4 key购买 nike

我正在使用 ASP.NET Identity 进行身份验证和授权。由于我以推荐的方式使用 docker(用于构建和运行的单独容器),因此我总是在每次部署后注销。似乎 ASP.NET Core 没有将 session 存储在数据库中。也因为我看不到他们所在的任何 table 。

如何解决此问题,以便我的用户不会在每次部署后注销?

我想我需要将 session 存储在数据库中。但是我找不到如何执行此操作的信息。我找到了有关 using Redis as session store 的信息.这接近了——我不确定这是否也会影响 ASP.NET Identity session ,或者仅影响像 TempData 这样的 session 存储。另一个问题是,我想使用 Pomelo.EntityFrameworkCore.MySql 提供程序将 session 存储在我的 MySQL 数据库中。

最佳答案

发现使用内存存储也会导致加密 key 出现问题。简而言之,ASP.NET Core 使用这些 key 来保护 session 等敏感数据。所以它们不是以纯文本形式存储的。似乎 ASP.NET 在第一次运行应用程序时自动生成这些 key 。

因为它运行在Docker容器中,这会导致两个大问题:

  • 加密 key 因重建容器镜像而丢失。 ASP.NET Core 自动生成一个新 session ,但无法解密现有 session ,因为它们是使用不同 key 加密的

  • 容器是隔离的,因此 session 的默认内存存储提供程序在每次新部署后都会丢失其数据

正如我所建议的,这可以通过使用与网络服务器不同的服务器上运行的存储来解决。我找不到任何 MySQL 实现。只有SQL server,好像是MSSQL。我通过安装 Redis 服务器来修复它。它用于 session 存储加密 key 。

要让 ASP.NET Core 在 Redis 中存储加密 key ,请安装 Microsoft.AspNetCore.DataProtection.Redis provider 并将以下行附加到 ConfigureServices 之前 AddOptions

var redis = ConnectionMultiplexer.Connect($"{redisIpAddress}:{redisPort}");
services.AddDataProtection().PersistKeysToRedis(redis, "DataProtection-Keys");

请注意,这只是 ASP.NET Core 自 1.1.0 版本以来的一部分。因为它依赖于 1.1.0 分支的其他包,我认为它不适用于 LTS 1.0 版本。在这种情况下,您可能需要编写一个与 1.0 兼容的自定义实现。但我还没有测试过这个,因为我在我的项目中使用的是 1.1.0。本文中的更多信息:http://www.tugberkugurlu.com/archive/asp-net-core-authentication-in-a-load-balanced-environment-with-haproxy-and-redis

总而言之,我不认为为此使用 Redis 而不是 SQL 数据库是个坏主意,因为 Redis 针对非常快速地提供键值对进行了优化。基础是使用 Redis 来缓存应用程序的其他部分,例如(复杂的)数据库查询。这可以加快您的应用程序并减少数据库服务器的负载。

关于session - 在 ASP.NET Core MVC Identity 中部署 Docker 后自动注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41663015/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com