Как получить. NET Вход в Core 3.1 для сохранения в нескольких экземплярах EC2 в Elasti c Beanstalk - PullRequest
1 голос
/ 01 мая 2020

У меня небольшое приложение. NET Core 3.1, которое иногда нужно масштабировать. Мне нужно, чтобы информация о вошедших в систему пользователя сохранялась во всех случаях, когда вращается EB. Я хотел бы сделать это, используя SQL Server RDS, который мы настроили. Я попытался добавить распределенный Sql серверный кэш и настроил таблицу для хранения состояния сеанса, как описано в документации ... но информация для входа в систему не сохраняется в этой таблице.

В моем Startup.cs ConfigureServices у меня есть:

var sqlSessionConnString = new SqlConnectionStringBuilder(Configuration.GetConnectionString("SqlSession"));
services.AddDistributedSqlServerCache(options =>
{
    options.ConnectionString = sqlSessionConnString.ConnectionString;
    options.SchemaName = "dbo";
    options.TableName = "TableName";
});
services.AddSession();

Когда я вхожу в систему и проверяю таблицу, в таблице нет данных, но мой логин все еще работает.

Что мне делать нужно сделать так, чтобы Identity сохранил информацию для входа в базу данных, а не в памяти сервера, чтобы логин моих пользователей сохранялся независимо от того, на какой экземпляр они маршрутизируются?

1 Ответ

0 голосов
/ 02 мая 2020

Отвечая на ваш вопрос: для настройки сеанса вам также необходимо добавить промежуточное ПО app.UseSession () использование внутри вашего метода Configure, чтобы

public void ConfigureServices(IServiceCollection services)
        {
            services.AddDistributedSqlServerCache(options =>
            {
                options.ConnectionString =
                    @"Server=localhost\SQLEXPRESS;Database=master;Trusted_Connection=True;";
                options.SchemaName = "dbo";
                options.TableName = "TestCache";
            });
            services.AddSession();
            //to inject httpcontet into controller
            services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

            services.AddControllers();
        }
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseSession();
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseRouting();

            //your auth settings
            //...

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }

И теперь внутри вашего контроллера вы можете сохранить добавить дополнительные значения в кеш, вызвав

 _distributedCache.SetString("TestString", "TestValue");

или сохранить данные только для указания c использования сеанса

_context.Session.SetString("name", "John");

А вот конкретный пример

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    private readonly IDistributedCache _distributedCache;
    private HttpContext _context;

    public WeatherForecastController(ILogger<WeatherForecastController> logger,
        IDistributedCache distributedCache,
        IHttpContextAccessor httpContextAccessor)
    {
        _distributedCache = distributedCache;
        _context = httpContextAccessor.HttpContext;
    }

    public string Get()
    {
        _distributedCache.SetString("TestString", "TestValue");
        if (_context.Session.Keys.Contains("name"))
            return $"Hello {_context.Session.GetString("name")}";  

        _context.Session.SetString("name", "John");
        return "Session was created";
    }
}

Вы увидите, что внутри SQL будут вставлены данные таблицы enter image description here

и созданы файлы cookie сеанса (.AspNetCore.Session)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...