Путь к файлу для PersistKeysToFileSystem на общем сервере

#c# #asp.net-mvc #asp.net-core-mvc #asp.net-core-identity #asp.net-core-mvc-2.0

#c# #asp.net-mvc #asp.net-core-mvc #asp.net-core-identity #asp.net-core-mvc-2.0

Вопрос:

Я пытаюсь сделать так, чтобы мои ключи сохранялись для пользователей, которые входят в систему. Поскольку в настоящее время я использую общий хостинг для веб-сайта, я решил использовать файловую систему для хранения связки ключей. Итак, код выглядит следующим образом:

 services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(""))
.SetApplicationName("MyWebsite")
.SetDefaultKeyLifetime(TimeSpan.FromDays(90))
.ProtectKeysWithCertificate(cert);
  

Однако, чего я на самом деле не понимаю, так это того, где я должен хранить эти ключи, и каким будет путь, который я передаю, чтобы они были там. Поскольку это приложение MVC Core, я немного сбит с толку, в MVC 5 я бы поместил его в папку App_Data, но здесь нет папки App_Data, и я хочу убедиться, что она остается безопасной и к ней нельзя получить доступ через браузер.

Другой вопрос, передаю ли я ему относительный путь или прямой путь? Если это относительно, то где моя отправная точка? Это bin, корневой каталог или что-то еще?

Ответ №1:

Вероятно, самый простой способ — создать папку внутри папки приложения. Например, создайте папку с именем Keys и используйте IHostingEnvironment объект для получения папки приложения. Что-то вроде этого:

 public class Startup
{
    private readonly IHostingEnvironment _environment;

    public Startup(IHostingEnvironment environment)
    {
        _environment = environment;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        var keysFolder = Path.Combine(_environment.ContentRootPath, "Keys");

        services.AddDataProtection()
            .PersistKeysToFileSystem(new DirectoryInfo(keysFolder))
            .SetApplicationName("MyWebsite")
            .SetDefaultKeyLifetime(TimeSpan.FromDays(90))
            .ProtectKeysWithCertificate(cert);
    }

    // snip
}
  

Комментарии:

1. Когда вы говорите «папка приложения», вы имеете в виду корневой каталог веб-сайта?

2. Точно, рядом с wwwroot папкой (но не внутри нее, иначе файлы могут попасть в браузер)

3. Что касается IHostingEnvironment, должен ли я тогда вводить это с помощью IServiceCollection?

4. Это один из худших подходов в истории, потому что в защищенной среде веб-приложений у вас нет доступа на запись к папке приложения — и: при следующем развертывании материал удаляется: навсегда.

5. @BenjaminAbt Я просто говорю, что t далеко не так плох, как вы утверждаете. Для начала .NET Core полностью отделяет код приложения от обслуживаемых ресурсов. Так что да, это безопасное место для размещения этих файлов. Нет ничего абсурдного в том, чтобы хранить там защищенные данные.