Мне сложно понять API защиты данных.
Я хочу настроить некоторые веб-приложения net core в кластерной среде (служебная ткань). Раньше вам нужно было просто убедиться, что у каждой машины один и тот же ключ в файле web.config. Простой. С новым API защиты данных это кажется немного более сложным (много!).
Из документации здесь кажется, что это должно быть так же просто, как настроить службу защиты данных с соответствующим сертификатом.
Однако я пробовал это:
public static void Main(string[] args)
{
// add data protection services
var serviceCollection = new ServiceCollection();
string thumbPrint = "XXXXXXXXXXXX";
serviceCollection.AddDataProtection()
.ProtectKeysWithDpapiNG($"CERTIFICATE=HashId:{thumbPrint}", flags: Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiNGProtectionDescriptorFlags.None);
var services = serviceCollection.BuildServiceProvider();
// create an instance of MyClass using the service provider
var instance = ActivatorUtilities.CreateInstance<MyClass>(services);
instance.RunSample();
}
public class MyClass
{
IDataProtector _protector;
// the 'provider' parameter is provided by DI
public MyClass(IDataProtectionProvider provider)
{
_protector = provider.CreateProtector("Contoso.MyClass.v1");
}
public void RunSample()
{
Console.Write("Enter input: ");
string input = Console.ReadLine();
// protect the payload
string protectedPayload = _protector.Protect(input);
Console.WriteLine($"Protect returned: {protectedPayload}");
// unprotect the payload
string unprotectedPayload = _protector.Unprotect(protectedPayload);
Console.WriteLine($"Unprotect returned: {unprotectedPayload}");
Console.ReadLine();
}
}
И я просто получаю исключение
System.InvalidOperationException occurred
HResult=0x80131509
Message=No service for type 'Microsoft.AspNetCore.DataProtection.Repositories.IXmlRepository' has been registered.
После некоторых поисков выясняется, что это связано с тем, что для ключей не указано постоянное хранилище.
Что здесь советуют? Должен ли я сохранять свои ключи в каком-то центральном месте (то есть в общей папке, доступной для всех моих приложений). Если да, то в чем причина?
.PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\"));
. - person Christo   schedule 25.07.2017