| File: KeyManagement\KeyRingBasedDataProtectionProvider.cs | Web Access |
| Project: src\aspnetcore\src\DataProtection\DataProtection\src\Microsoft.AspNetCore.DataProtection.csproj (Microsoft.AspNetCore.DataProtection) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using Microsoft.AspNetCore.DataProtection.KeyManagement.Internal; using Microsoft.AspNetCore.Shared; using Microsoft.Extensions.Logging; namespace Microsoft.AspNetCore.DataProtection.KeyManagement; internal sealed unsafe class KeyRingBasedDataProtectionProvider : IDataProtectionProvider { private readonly IKeyRingProvider _keyRingProvider; private readonly ILogger _logger; public KeyRingBasedDataProtectionProvider(IKeyRingProvider keyRingProvider, ILoggerFactory loggerFactory) { _keyRingProvider = keyRingProvider; _logger = loggerFactory.CreateLogger<KeyRingBasedDataProtector>(); // note: for protector (not provider!) type } public IDataProtector CreateProtector(string purpose) { ArgumentNullThrowHelper.ThrowIfNull(purpose); #if NET // Always return the span-capable protector on .NET. It inspects the resolved encryptor at each Protect/Unprotect call // and falls back to the byte[] path when the encryptor does not implement ISpanAuthenticatedEncryptor. // // We could determine whether the encryptor implements ISpanAuthenticatedEncryptor here and return the appropriate protector type, // but that forces a keyring resolve (which may hit the configured key store, e.g. database or blob storage) during startup, which is not expected. See dotnet/aspnetcore#67447. return new KeyRingBasedSpanDataProtector( logger: _logger, keyRingProvider: _keyRingProvider, originalPurposes: null, newPurpose: purpose); #else return new KeyRingBasedDataProtector( logger: _logger, keyRingProvider: _keyRingProvider, originalPurposes: null, newPurpose: purpose); #endif } }