Dostawcy magazynu kluczy w usłudze ASP.NET Core
System ochrony danych domyślnie wykorzystuje mechanizm odnajdywania, aby określić, gdzie powinny być utrwalane klucze kryptograficzne. Deweloper może zastąpić domyślny mechanizm odnajdywania i ręcznie określić lokalizację.
Ostrzeżenie
Jeśli określisz jawną lokalizację trwałości klucza, system ochrony danych wyrejestruje domyślne szyfrowanie klucza w rest mechanizmie, więc klucze nie są już szyfrowane w restlokalizacji . Zaleca się dodatkowo określenie jawnego mechanizmu szyfrowania kluczy dla wdrożeń produkcyjnych.
System plików
Aby skonfigurować repozytorium kluczy opartych na systemie plików, wywołaj procedurę PersistKeysToFileSystem konfiguracji, jak pokazano poniżej. Podaj wskazanie DirectoryInfo repozytorium, w którym powinny być przechowywane klucze:
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"c:\temp-keys\"));
}
Element DirectoryInfo
może wskazywać katalog na komputerze lokalnym lub wskazywać folder w udziale sieciowym. Jeśli wskazuje katalog na komputerze lokalnym (i scenariusz polega na tym, że tylko aplikacje na komputerze lokalnym wymagają dostępu do korzystania z tego repozytorium), rozważ użycie interfejsu DPAPI systemu Windows (w systemie Windows) do szyfrowania kluczy pod adresem rest. W przeciwnym razie rozważ użycie certyfikatu X.509 do szyfrowania kluczy pod adresem rest.
Azure Storage
Pakiet Azure.Extensions.AspNetCore.DataProtection.Blobs umożliwia przechowywanie kluczy ochrony danych w usłudze Azure Blob Storage. Klucze można udostępniać w kilku wystąpieniach aplikacji internetowej. Aplikacje mogą udostępniać pliki cookie uwierzytelniania lub ochronę CSRF na wielu serwerach.
Aby skonfigurować dostawcę usługi Azure Blob Storage, wywołaj jedno z PersistKeysToAzureBlobStorage przeciążeń.
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.PersistKeysToAzureBlobStorage(new Uri("<blob URI including SAS token>"));
}
Jeśli aplikacja internetowa jest uruchomiona jako usługa platformy Azure, parametry połączenia można użyć do uwierzytelniania w usłudze Azure Storage przy użyciu usługi Azure.Storage.Blobs.
Ostrzeżenie
W tym artykule przedstawiono użycie parametry połączenia. W przypadku lokalnej bazy danych użytkownik nie musi być uwierzytelniany, ale w środowisku produkcyjnym parametry połączenia czasami zawiera hasło do uwierzytelniania. Poświadczenie hasła właściciela zasobu (ROPC) jest zagrożeniem bezpieczeństwa, którego należy unikać w produkcyjnych bazach danych. Aplikacje produkcyjne powinny korzystać z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Aby uzyskać więcej informacji na temat uwierzytelniania aplikacji wdrożonych w środowiskach testowych lub produkcyjnych, zobacz Bezpieczne przepływy uwierzytelniania.
string connectionString = "<connection_string>";
string containerName = "my-key-container";
string blobName = "keys.xml";
BlobContainerClient container = new BlobContainerClient(connectionString, containerName);
// optional - provision the container automatically
await container.CreateIfNotExistsAsync();
BlobClient blobClient = container.GetBlobClient(blobName);
services.AddDataProtection()
.PersistKeysToAzureBlobStorage(blobClient);
Uwaga
Parametry połączenia konta magazynu można znaleźć w witrynie Azure Portal w sekcji "Klucze dostępu" lub uruchamiając następujące polecenie interfejsu wiersza polecenia:
az storage account show-connection-string --name <account_name> --resource-group <resource_group>
Redis
Pakiet Microsoft.AspNetCore.DataProtection.StackExchangeRedis umożliwia przechowywanie kluczy ochrony danych w pamięci podręcznej Redis. Klucze można udostępniać w kilku wystąpieniach aplikacji internetowej. Aplikacje mogą udostępniać pliki cookie uwierzytelniania lub ochronę CSRF na wielu serwerach.
Pakiet Microsoft.AspNetCore.DataProtection.Redis umożliwia przechowywanie kluczy ochrony danych w pamięci podręcznej Redis. Klucze można udostępniać w kilku wystąpieniach aplikacji internetowej. Aplikacje mogą udostępniać pliki cookie uwierzytelniania lub ochronę CSRF na wielu serwerach.
Aby skonfigurować usługę Redis, wywołaj jedno z PersistKeysToStackExchangeRedis przeciążeń:
public void ConfigureServices(IServiceCollection services)
{
var redis = ConnectionMultiplexer.Connect("<URI>");
services.AddDataProtection()
.PersistKeysToStackExchangeRedis(redis, "DataProtection-Keys");
}
Aby skonfigurować usługę Redis, wywołaj jedno z PersistKeysToRedis przeciążeń:
public void ConfigureServices(IServiceCollection services)
{
var redis = ConnectionMultiplexer.Connect("<URI>");
services.AddDataProtection()
.PersistKeysToRedis(redis, "DataProtection-Keys");
}
Aby uzyskać więcej informacji, zobacz następujące tematy:
Rejestr
Dotyczy tylko wdrożeń systemu Windows.
Czasami aplikacja może nie mieć dostępu do zapisu w systemie plików. Rozważmy scenariusz, w którym aplikacja jest uruchomiona jako konto usługi wirtualnej (na przykład pula identityaplikacji w3wp.exe). W takich przypadkach administrator może aprowizować klucz rejestru dostępny dla konta identityusługi . Wywołaj metodę PersistKeysToRegistry rozszerzenia, jak pokazano poniżej. RegistryKey Podaj wskazanie lokalizacji, w której powinny być przechowywane klucze kryptograficzne:
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.PersistKeysToRegistry(Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Sample\keys", true));
}
Ważne
Zalecamy używanie interfejsu DPAPI systemu Windows do szyfrowania kluczy pod adresem rest.
Entity Framework Core
Pakiet Microsoft.AspNetCore.DataProtection.EntityFrameworkCore udostępnia mechanizm przechowywania kluczy ochrony danych w bazie danych przy użyciu programu Entity Framework Core. Pakiet Microsoft.AspNetCore.DataProtection.EntityFrameworkCore
NuGet należy dodać do pliku projektu, ale nie jest częścią Microsoft.AspNetCore.App metapakiet.
Za pomocą tego pakietu klucze mogą być współużytkowane przez wiele wystąpień aplikacji internetowej.
Aby skonfigurować dostawcę EF Core , wywołaj metodę PersistKeysToDbContext :
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
// Add a DbContext to store your Database Keys
services.AddDbContext<MyKeysContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MyKeysConnection")));
// using Microsoft.AspNetCore.DataProtection;
services.AddDataProtection()
.PersistKeysToDbContext<MyKeysContext>();
services.AddDefaultIdentity<IdentityUser>()
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
Jeśli chcesz zobaczyć komentarze kodu przetłumaczone na języki inne niż angielski, poinformuj nas o tym w tym problemie z dyskusją w usłudze GitHub.
Parametr ogólny , TContext
musi dziedziczyć z DbContext i implementować IDataProtectionKeyContext:
using Microsoft.AspNetCore.DataProtection.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using WebApp1.Data;
namespace WebApp1
{
class MyKeysContext : DbContext, IDataProtectionKeyContext
{
// A recommended constructor overload when using EF Core
// with dependency injection.
public MyKeysContext(DbContextOptions<MyKeysContext> options)
: base(options) { }
// This maps to the table that stores keys.
public DbSet<DataProtectionKey> DataProtectionKeys { get; set; }
}
}
Utwórz tabelę DataProtectionKeys
.
Wykonaj następujące polecenia w oknie Menedżer pakietów Console (PMC):
Add-Migration AddDataProtectionKeys -Context MyKeysContext
Update-Database -Context MyKeysContext
MyKeysContext
DbContext
jest zdefiniowany w poprzednim przykładzie kodu. Jeśli używasz elementu DbContext
o innej nazwie, zastąp nazwę nazwą MyKeysContext
DbContext
.
Klasa DataProtectionKeys
/jednostka przyjmuje strukturę pokazaną w poniższej tabeli.
Właściwość/pole | Typ CLR | Typ SQL |
---|---|---|
Id |
int |
int , PK, IDENTITY(1,1) , nie null |
FriendlyName |
string |
nvarchar(MAX) zero |
Xml |
string |
nvarchar(MAX) zero |
Niestandardowe repozytorium kluczy
Jeśli mechanizmy wbudowane nie są odpowiednie, deweloper może określić własny mechanizm trwałości klucza, udostępniając niestandardowy IXmlRepositoryelement .