В принципе, это ничем не отличается от любого другого сценария общей конфигурации. Вам нужно сделать две вещи:
Сохранить список ключей для общей файловой системы или сетевого пути, к которому могут обращаться все процессы / приложения:
services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\"));
Убедитесь, что все процессы / приложения используют одно и то же имя приложения:
services.AddDataProtection()
.SetApplicationName("shared app name");
Второй элемент менее важен для сценария веб-фермы, поскольку это одно и то же приложение и по умолчанию будет иметь одно и то же имя. Однако всегда лучше быть явным, и тогда, если вам нужно поделиться с совершенно другим приложением, вы уже настроены и готовы к работе.
Короче говоря, вам нужно добавить следующий код:
services.AddDataProtection()
.SetApplicationName("shared app name")
.PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\"));
К замечанию @ LGSon в комментариях под вашим вопросом, вы также в конечном итоге столкнетесь с проблемой кэширования / сессий. Независимо от того, чтобы быть одним и тем же «приложением», вы должны рассматривать каждый экземпляр веб-фермы как отдельное приложение. Каждый из них является отдельным процессом, что означает, что у них есть свое собственное выделение памяти. Если вы используете кеширование памяти (которое также является хранилищем по умолчанию для сеансов), то оно будет доступно только для отдельного процесса, который его создал. Поэтому каждый процесс будет иметь отдельный кеш и отдельные сеансы. Чтобы поделиться этой информацией, вам нужно использовать распределенный кеш, такой как Redis или SQL Server. Смотри: https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed?view=aspnetcore-2.2#establish-distributed-caching-services.
Примечание. Несмотря на то, что кэш-память «распределена», она фактически не распределена. Это просто реализация IDistributedCache
, которая хранится в памяти. Поскольку он хранится в памяти, он все еще связан с процессом.