Как распространять ключи защиты данных с помощью веб-приложения .NET Core? - PullRequest
0 голосов
/ 30 января 2019

Мне немного неясно, как работают ключи защиты данных в среде веб-фермы.У меня нет общего расположения, которое могут использовать все серверы (и я не хочу иметь дело с разрешениями).Поэтому я хотел бы сгенерировать ключ и распространить его вместе с веб-приложением.

Я делаю следующее, но не уверен, правильно ли это.Таким образом, я генерирую файл ключа локально на своем компьютере разработчика с помощью:

var specialFolder = Environment.SpecialFolder.CommonApplicationData;
var appDataPath = Path.Combine(
     Environment.GetFolderPath(specialFolder),
    "company", 
    "product"
);
services.AddDataProtection().PersistKeysToFileSystem(new DirectoryInfo(appDataPath));

Это создает файл key-some-guid.xml.Затем я распространяю этот файл с моим веб-приложением.

Теперь, когда я запускаю свое веб-приложение, в службах Startup.Configure скопируйте этот файл в местоположение appDataPath (определено выше) и вызовите services.AddDataProtection().PersistKeysToFileSystem(new DirectoryInfo(appDataPath));,

Будет ли это работать?Или я что-то упускаю?

1 Ответ

0 голосов
/ 30 января 2019

Отвечая на мой собственный вопрос.Кажется, что следующее работает через веб-ферму.Вызовите метод ниже из Startup.ConfigureServices.Предполагается, что ключ (созданный на компьютере разработчика) находится в папке Keys в корневом каталоге проекта.

public Startup(IHostingEnvironment env)
{
    /* skipping boilerplate setup code */

    Environment = env;
}

private IHostingEnvironment Environment { get; set; }

private void ConfigureDataProtection(IServiceCollection services) {
    // get the file from the Keys directory
    string keysFile = string.Empty;
    string keysPath = Path.Combine(Environment.ContentRootPath, "Keys");
    if (!Directory.Exists(keysPath)) {
        Log.Add($"Keys directory {keysPath} doesn't exist");
        return;
    }

    string[] files = Directory.GetFiles(keysPath);
    if (files.Length == 0) {
        LLog.Add($"No keys found in directory {keysPath}");
        return;
    } else {
        keysFile = files[0];

        if (files.Length >= 2) {
            LLog.Add($"Warning: More than 1 key found in directory {keysPath}.  Using first one.");
        }
    }

    // find and optionally create the path for the key storage
    var appDataPath = Path.Combine(
        System.Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData),
        "companyName",
        "productName"
    );

    if (!Directory.Exists(appDataPath)) {
        try {
            Directory.CreateDirectory(appDataPath);
        } catch (Exception ex) {
            Log.Add($"Error creating key storage folder at {appDataPath}.  Error: {ex.Message}");
            return;
        }
    }

    // delete any keys from the storage directory
    try {
        foreach (var file in new DirectoryInfo(appDataPath).GetFiles()) file.Delete();
    } catch (Exception ex) {
        Log.Add($"Error deleting keys from {appDataPath}.  Error: {ex.Message}");
        return;
    }

    try {
        string targetPath = Path.Combine(appDataPath, new FileInfo(keysFile).Name);
        File.Copy(keysFile, targetPath, true);
    } catch (Exception ex) {
        Log.Add($"Error copying key file {keysFile} to {appDataPath}.  Error: {ex.Message}");
        return;
    }

    // everything is in place
    services.AddDataProtection()
        .PersistKeysToFileSystem(new DirectoryInfo(appDataPath))
        .DisableAutomaticKeyGeneration();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...