Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Dataskyddssystemet använder som standard en identifieringsmekanism för att avgöra var kryptografiska nycklar ska sparas. Utvecklaren kan åsidosätta standardidentifieringsmekanismen och manuellt ange platsen.
Varning
Om du anger en explicit plats för nyckelpersistence avregistrerar dataskyddssystemet standardnyckelkryptering i vila, så nycklar krypteras inte längre i vila. Vi rekommenderar att du dessutom anger en explicit nyckelkrypteringsmekanism för produktionsdistributioner.
Filsystem
Om du vill konfigurera en filsystembaserad nyckellagringsplats anropar du konfigurationsrutinen PersistKeysToFileSystem enligt nedan. Ange en DirectoryInfo pekar på lagringsplatsen där nycklar ska lagras:
public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToFileSystem(new DirectoryInfo(@"c:\temp-keys\"));
}
              DirectoryInfo Kan peka på en katalog på den lokala datorn eller peka på en mapp på en nätverksresurs. Om du pekar på en katalog på den lokala datorn (och scenariot är att endast appar på den lokala datorn behöver åtkomst för att använda den här lagringsplatsen) bör du överväga att använda Windows DPAPI (i Windows) för att kryptera nycklarna i vila. I annat fall bör du överväga att använda ett X.509-certifikat för att kryptera vilande nycklar.
Azure Storage
              
              Azure.Extensions.AspNetCore.DataProtection.Blobs NuGet-paketet tillhandahåller API för lagring av dataskyddsnycklar i Azure Blob Storage. Nycklar kan delas mellan flera instanser av en webbapp. Appar kan dela autentiseringscookies eller CSRF-skydd på flera servrar.
Anmärkning
Vägledning om hur du lägger till paket i .NET-appar finns i artiklarna under Installera och hantera paket i arbetsflödet för paketförbrukning (NuGet-dokumentation). Bekräfta rätt paketversioner på NuGet.org.
Om du vill interagera med Azure Key Vault lokalt med autentiseringsuppgifter för utvecklare loggar du antingen in på ditt lagringskonto i Visual Studio eller loggar in med Azure CLI. Om du inte redan har installerat Azure CLI kan du läsa Installera Azure CLI. Du kan köra följande kommando i PowerShell-panelen Utvecklare i Visual Studio eller från ett kommandogränssnitt när du inte använder Visual Studio:
az login
Mer information finns i Logga in på Azure med hjälp av utvecklarverktyg.
Konfigurera Azure Blob Storage för att underhålla dataskyddsnycklar:
- Skapa ett Azure Storage-konto. 
- Skapa en container för att lagra dataskyddsnyckelfilen. 
- Vi rekommenderar att du använder Azure Managed Identity och rollbaserad åtkomstkontroll (RBAC) för att få åtkomst till nyckellagringsbloben. Du behöver inte skapa en nyckelfil och ladda upp den till containern för lagringskontot. Ramverket skapar filen åt dig. Om du vill granska innehållet i en nyckelfil använder du snabbmenyns visa /redigera-kommando i slutet av en nyckelrad i portalen. 
Anmärkning
Om du planerar att använda en blob-URI med en signatur för delad åtkomst (SAS) i stället för en Hanterad Identityanvänder du en textredigerare för att skapa en XML-nyckelfil på den lokala datorn:
<?xml version="1.0" encoding="utf-8"?>
<repository>
</repository>
Ladda upp nyckelfilen till containern för lagringskontot. Använd snabbmenyns visa /redigera-kommando i slutet av nyckelraden i portalen för att bekräfta att bloben innehåller föregående innehåll. Genom att skapa filen manuellt kan du hämta blob-URI:n med SAS från portalen för att konfigurera appen i ett senare steg.
- Skapa en Azure Managed Identity (eller lägg till en roll i den befintliga hanterade Identity som du planerar att använda) med rollen Storage Blob Data-deltagare . Tilldela den hanterade Identity till den Azure App Service som är värd för distributionen: Inställningar>Identity>Användartilldelad>Lägg till. - Anmärkning - Om du även planerar att köra en app lokalt med en behörig användare för blobåtkomst med hjälp av Azure CLI eller Visual Studio Azure Service Authentication lägger du till utvecklarens Azure-användarkonto i Åtkomstkontroll (IAM) med rollen Storage Blob Data Contributor . Om du vill använda Azure CLI via Visual Studio, kör kommandot - az loginfrån "Utvecklarens PowerShell-panel" och följ anvisningarna för att autentisera med klientorganisationen.
Om du vill konfigurera Azure Blob Storage-providern anropar du en av PersistKeysToAzureBlobStorage överlagringarna i appen. I följande exempel används den överlagring som accepterar en blob-URI och tokenautentiseringsuppgifter (TokenCredential), som förlitar sig på en Azure Managed Identity för rollbaserad åtkomstkontroll (RBAC).
Andra överbelastningar baseras på:
- En blob-URI och lagringsdelad nyckelautentisering (StorageSharedKeyCredential).
- En blob-URI med en signatur för delad åtkomst (SAS).
- En anslutningssträng, containernamn och blobnamn.
- En blobklient (BlobClient).
Mer information om Azure SDK:s API och autentisering finns i Autentisera .NET-appar till Azure-tjänster med hjälp av Azure-biblioteketIdentity. Information om loggning finns i Loggning med Azure SDK för .NET: Loggning utan klientregistrering. För appar som använder beroendeinjektion kan en app anropa AddAzureClientsCore, skicka true för enableLogForwarding för att skapa och koppla loggningsinfrastrukturen.
I filen Program där tjänster är registrerade:
TokenCredential? credential;
if (builder.Environment.IsProduction())
{
    credential = new ManagedIdentityCredential("{MANAGED IDENTITY CLIENT ID}");
}
else
{
    // Local development and testing only
    DefaultAzureCredentialOptions options = new()
    {
        // Specify the tenant ID to use the dev credentials when running the app locally
        // in Visual Studio.
        VisualStudioTenantId = "{TENANT ID}",
        SharedTokenCacheTenantId = "{TENANT ID}"
    };
    credential = new DefaultAzureCredential(options);
}
builder.Services.AddDataProtection()
    .SetApplicationName("{APPLICATION NAME}")
    .PersistKeysToAzureBlobStorage(new Uri("{BLOB URI}"), credential);
              {MANAGED IDENTITY CLIENT ID}: Azure Hanterad Identity Klient-ID (GUID).
              {TENANT ID}: Hyresgäst-ID.
              {APPLICATION NAME}: SetApplicationName anger det unika namnet på den här appen i dataskyddssystemet. Värdet ska matcha mellan distributioner av appen.
              {BLOB URI}: Fullständig URI till nyckelfilen. URI:n genereras av Azure Storage när du skapar nyckelfilen. Använd inte en SAS.
Alternativ sas-metod (signatur för delad åtkomst): Som ett alternativ till att använda en hanterad Identity för åtkomst till nyckelbloben i Azure Blob Storage kan du anropa överlagringen PersistKeysToAzureBlobStorage som accepterar en blob-URI med en SAS-token:
builder.Services.AddDataProtection()
    .SetApplicationName("{APPLICATION NAME}")
    .PersistKeysToAzureBlobStorage(new Uri("{BLOB URI WITH SAS}"));
I Startup.ConfigureServices:
TokenCredential? credential;
if (_env.IsProduction())
{
    credential = new ManagedIdentityCredential("{MANAGED IDENTITY CLIENT ID}");
}
else
{
    // Local development and testing only
    DefaultAzureCredentialOptions options = new()
    {
        // Specify the tenant ID to use the dev credentials when running the app locally
        // in Visual Studio.
        VisualStudioTenantId = "{TENANT ID}",
        SharedTokenCacheTenantId = "{TENANT ID}"
    };
    credential = new DefaultAzureCredential(options);
}
services.AddDataProtection()
    .SetApplicationName("{APPLICATION NAME}")
    .PersistKeysToAzureBlobStorage(new Uri("{BLOB URI}"), credential);
              {MANAGED IDENTITY CLIENT ID}: Azure Hanterad Identity Klient-ID (GUID).
              {TENANT ID}: Hyresgäst-ID.
              {APPLICATION NAME}: SetApplicationName anger det unika namnet på den här appen i dataskyddssystemet. Värdet ska matcha mellan distributioner av appen.
              {BLOB URI}: Fullständig URI till nyckelfilen. URI:n genereras av Azure Storage när du skapar nyckelfilen. Använd inte en SAS.
Exempel:
https://contoso.blob.core.windows.net/data-protection/keys.xml
Alternativ sas-metod (signatur för delad åtkomst): Som ett alternativ till att använda en hanterad Identity för åtkomst till nyckelbloben i Azure Blob Storage kan du anropa överlagringen PersistKeysToAzureBlobStorage som accepterar en blob-URI med en SAS-token:
services.AddDataProtection()
    .SetApplicationName("{APPLICATION NAME}")
    .PersistKeysToAzureBlobStorage(new Uri("{BLOB URI WITH SAS}"));
              {APPLICATION NAME}: SetApplicationName anger det unika namnet på den här appen i dataskyddssystemet. Värdet ska matcha mellan distributioner av appen.
              {BLOB URI WITH SAS}: Den fullständiga URI:n där nyckelfilen ska lagras med SAS-token som en frågesträngsparameter. URI:n genereras av Azure Storage när du begär en SAS för den uppladdade nyckelfilen. I följande exempel är data-protectioncontainernamnet , och lagringskontots namn är contoso. Nyckelfilen heter keys.xml. Sas-frågesträngen (signatur för delad åtkomst) finns i slutet av URI :n ({SHARED ACCESS SIGNATURE} platshållaren).
Exempel:
https://contoso.blob.core.windows.net/data-protection/keys.xml{SHARED ACCESS SIGNATURE}
Om webbappen körs som en Azure-tjänst kan en anslutningssträng användas för att autentisera till Azure Storage med hjälp av BlobContainerClient, enligt följande exempel.
Varning
Den här artikeln visar användningen av anslutningssträngar. Med en lokal databas behöver användaren inte autentiseras, men i produktion innehåller anslutningssträngar ibland ett lösenord för att autentisera. En resursägares lösenordsautentiseringsuppgifter (ROPC) är en säkerhetsrisk som bör undvikas i produktionsdatabaser. Produktionsappar bör använda det säkraste tillgängliga autentiseringsflödet. Mer information om autentisering för appar som distribueras till test- eller produktionsmiljöer finns i Säkra autentiseringsflöden.
Det valfria anropet till CreateIfNotExistsAsync skapar containern automatiskt om den inte finns.
Anslutningssträngen ({CONNECTION STRING} platshållaren) till lagringskontot finns i Entra- eller Azure-portalen under avsnittet "Åtkomstnycklar" eller genom att köra följande Azure CLI-kommando:
az storage account show-connection-string --name <account_name> --resource-group <resource_group>
I filen Program där tjänster är registrerade:
string connectionString = "{CONNECTION STRING}";
string containerName = "{CONTAINER NAME}";
string blobName = "keys.xml";
var container = new BlobContainerClient(connectionString, containerName);
await container.CreateIfNotExistsAsync();
BlobClient blobClient = container.GetBlobClient(blobName);
builder.Services.AddDataProtection().PersistKeysToAzureBlobStorage(blobClient);
I Startup.ConfigureServices:
string connectionString = "{CONNECTION STRING}";
string containerName = "{CONTAINER NAME}";
string blobName = "keys.xml";
var container = new BlobContainerClient(connectionString, containerName);
await container.CreateIfNotExistsAsync();
BlobClient blobClient = container.GetBlobClient(blobName);
services.AddDataProtection().PersistKeysToAzureBlobStorage(blobClient);
Redis
Med paketet Microsoft.AspNetCore.DataProtection.StackExchangeRedis kan du lagra dataskyddsnycklar i en Redis-cache. Nycklar kan delas mellan flera instanser av en webbapp. Appar kan dela autentiseringscookies eller CSRF-skydd på flera servrar.
Paketet Microsoft.AspNetCore.DataProtection.Redis tillåter lagring av dataskyddsnycklar i en Redis-cache. Nycklar kan delas mellan flera instanser av en webbapp. Appar kan dela autentiseringscookies eller CSRF-skydd på flera servrar.
För att konfigurera Redis kan du anropa en av överlagringarna PersistKeysToStackExchangeRedis.
public void ConfigureServices(IServiceCollection services)
{
    var redis = ConnectionMultiplexer.Connect("<URI>");
    services.AddDataProtection()
        .PersistKeysToStackExchangeRedis(redis, "DataProtection-Keys");
}
För att konfigurera Redis kan du anropa en av överlagringarna PersistKeysToRedis.
public void ConfigureServices(IServiceCollection services)
{
    var redis = ConnectionMultiplexer.Connect("<URI>");
    services.AddDataProtection()
        .PersistKeysToRedis(redis, "DataProtection-Keys");
}
Mer information finns i följande avsnitt:
Registeringssystem
gäller endast för Windows-distributioner.
Ibland kanske appen inte har skrivåtkomst till filsystemet. Tänk dig ett scenario där en app körs som ett virtuellt tjänstkonto (till exempel w3wp.exe apppoolsidentitet). I dessa fall kan administratören tilldela en registernyckel som är tillgänglig för tjänstekontots identitet. PersistKeysToRegistry Anropa tilläggsmetoden enligt nedan. Ange en RegistryKey pekar på den plats där kryptografiska nycklar ska lagras:
public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToRegistry(Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Sample\keys", true));
}
Viktigt!
Vi rekommenderar att du använder Windows DPAPI för att kryptera nycklarna i vila.
Entity Framework Core
Paketet Microsoft.AspNetCore.DataProtection.EntityFrameworkCore tillhandahåller en mekanism för att lagra dataskyddsnycklar till en databas med Entity Framework Core. 
              Microsoft.AspNetCore.DataProtection.EntityFrameworkCore NuGet-paketet måste läggas till i projektfilen, det är inte en del av Microsoft.AspNetCore.App metapaket.
Med det här paketet kan nycklar delas mellan flera instanser av en webbapp.
Om du vill konfigurera providern EF Core anropar du PersistKeysToDbContext metoden:
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);
}
Om du vill se kodkommentar översatta till andra språk än engelska kan du meddela oss i det här GitHub-diskussionsproblemet.
Den generiska parametern , TContextmåste ärva från DbContext och implementera 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; }
    }
}
              DataProtectionKeys Skapa tabellen.
Kör följande kommandon i fönstret Package Manager Console (PMC):
Add-Migration AddDataProtectionKeys -Context MyKeysContext
Update-Database -Context MyKeysContext
              MyKeysContext är DbContext definierat i föregående kodexempel. Om du använder ett DbContext med ett annat namn ersätter du ditt DbContext namn med MyKeysContext.
Klassen DataProtectionKeys /entiteten antar strukturen som visas i följande tabell.
| Egenskap/fält | CLR-typ | SQL-typ | 
|---|---|---|
| Id | int | int, PK,IDENTITY(1,1), inte null | 
| FriendlyName | string | nvarchar(MAX)noll | 
| Xml | string | nvarchar(MAX)noll | 
Lagringsplats för anpassad nyckel
Om de inbyggda mekanismerna inte är lämpliga kan utvecklaren ange sin egen mekanism för nyckelvaraktighet genom att tillhandahålla en anpassad IXmlRepository.
ASP.NET Core