我使用ASP.NET Identity进行身份验证和授权。由于我在推荐的方式上使用docker(用于构建和运行的单独容器),因此在每次部署后我总是会注销。似乎ASP.NET Core不会将会话存储在数据库中。也导致我无法看到任何表格。
如何解决此问题,以便我的用户在每次部署后都不会注销?
我想我需要将会话存储在数据库中。但我无法找到如何做到这一点的信息。我找到了有关using Redis as session store的信息。这很接近 - 我不确定,这是否也会影响ASP.NET Identity会话,或者只影响TempData等会话存储。另一个问题是,我想使用Pomelo.EntityFrameworkCore.MySql提供程序将会话存储在我的MySQL数据库中。
答案 0 :(得分:1)
发现使用内存存储也会导致加密密钥出现问题。简而言之,ASP.NET Core使用这些密钥来保护会话等敏感数据。所以它们不是以纯文本形式存储的。似乎ASP.NET在第一次运行应用程序时自动生成这些键。
因为它在Docker容器中运行,这将导致两个大问题:
通过重建容器图像来丢失登记密钥。 ASP.NET Core自动生成一个新的,但无法解密现有会话,因为它们是使用不同的密钥加密的
容器是隔离的,因此会话的默认内存存储提供程序会在每次新部署后丢失其数据
这可以通过使用运行在与Web服务器不同的服务器上的存储来解决,正如我所建议的那样。我找不到任何MySQL实现。只有SQL服务器,这似乎是MSSQL。我通过安装Redis服务器来修复它。它用于会话存储和加密密钥。
要在Redis中使用ASP.NET Core存储加密密钥,请安装Microsoft.AspNetCore.DataProtection.Redis提供程序,并在ConfigureServices
之前将以下行附加到AddOptions
var redis = ConnectionMultiplexer.Connect($"{redisIpAddress}:{redisPort}");
services.AddDataProtection().PersistKeysToRedis(redis, "DataProtection-Keys");
请注意,自1.1.0发布以来,这只是ASP.NET Core的一部分。因为它依赖于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缓存应用程序的其他部分,如(复杂)数据库查询。这可以加速您的应用程序并减少数据库服务器的负载。