DataProtection Persist Keys To Db Context Issue

See original GitHub issue

I have .Net 6.0, Abp 7.1.0 Solution. I am trying to persist data protection keys to db, as mentioned in the doc: https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/overview?view=aspnetcore-6.0#persistkeystodbcontext

But I am getting dependency issues, when methods that use DataProtection.

My Startup Class Looks like this. I Also tried this using IocManager/ServiceCollection in EntityFrameowkrModule, but the same error. Can Anyone help on this?

    public void ConfigureServices(IServiceCollection services)
    {
        //MVC
        services.AddControllersWithViews(
            options => { options.Filters.Add(new AbpAutoValidateAntiforgeryTokenAttribute()); }
        ).AddNewtonsoftJson(options =>
        {
            options.SerializerSettings.ContractResolver = new AbpMvcContractResolver(IocManager.Instance)
            {
                NamingStrategy = new CamelCaseNamingStrategy()
            };
        });

        IdentityRegistrar.Register(services);
        services.Configure<DataProtectionTokenProviderOptions>(options =>
        {
            options.TokenLifespan = System.TimeSpan.FromMinutes(_appConfiguration.GetValue<int>(AppSettingNames.DataProtectionTokenLifeSpanInMinute, MyAppConsts.DefaultDataProtectionTokenLifeSpanInMinute));
        });

        services.AddDataProtection().PersistKeysToDbContext<MyAppDbContext>().SetApplicationName("MyApp");

        AuthConfigurer.Configure(services, _appConfiguration);

        services.AddSignalR();

        // Configure CORS for angular2 UI
        services.AddCors(
            options => options.AddPolicy(
                _defaultCorsPolicyName,
                builder => builder
                    .WithOrigins(
                        // App:CorsOrigins in appsettings.json can contain more than one address separated by comma.
                        _appConfiguration["App:CorsOrigins"]
                            .Split(",", StringSplitOptions.RemoveEmptyEntries)
                            .Select(o => o.RemovePostFix("/"))
                            .ToArray()
                    )
                    .AllowAnyHeader()
                    .AllowAnyMethod()
                    .AllowCredentials()
            )
        );

        // Swagger - Enable this line and the related lines in Configure method to enable swagger UI
        ConfigureSwagger(services);

        services.ConfigureIOptions(_appConfiguration);
        // Configure Abp and Dependency Injection
        services.AddAbpWithoutCreatingServiceProvider<MyAppWebHostModule>(
            // Configure Log4Net logging
            options => options.IocManager.IocContainer.AddFacility<LoggingFacility>(
                f => f.UseAbpLog4Net().WithConfig(_hostingEnvironment.IsDevelopment()
                    ? "log4net.config"
                    : "log4net.Production.config"
                )
            )
        );
    }
ERROR 2022-08-23 10:06:36,741 [orker] Protection.KeyManagement.KeyRingProvider - An error occurred while reading the key ring.
Castle.MicroKernel.Handlers.HandlerException: Can't create component 'MyApp.EntityFrameworkCore.MyAppDbContext' as it has dependencies to be satisfied.

'MyApp.EntityFrameworkCore.MyAppDbContext' is waiting for the following dependencies:
- Service 'Microsoft.EntityFrameworkCore.DbContextOptions`1[[MyApp.EntityFrameworkCore.MyAppDbContext, MyApp.EntityFrameworkCore, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' which was not registered.

   at Castle.MicroKernel.Handlers.DefaultHandler.AssertNotWaitingForDependency()
   at Castle.MicroKernel.Handlers.DefaultHandler.ResolveCore(CreationContext context, Boolean requiresDecommission, Boolean instanceRequired, Burden& burden)
   at Castle.MicroKernel.Handlers.DefaultHandler.Resolve(CreationContext context, Boolean instanceRequired)
   at Castle.MicroKernel.DefaultKernel.ResolveComponent(IHandler handler, Type service, Arguments additionalArguments, IReleasePolicy policy, Boolean ignoreParentContext)
   at Castle.MicroKernel.DefaultKernel.Castle.MicroKernel.IKernelInternal.Resolve(Type service, Arguments arguments, IReleasePolicy policy, Boolean ignoreParentContext)
   at Castle.MicroKernel.DefaultKernel.Resolve(Type service, Arguments arguments)
   at Castle.Windsor.MsDependencyInjection.ScopedWindsorServiceProvider.GetServiceInternal(Type serviceType, Boolean isOptional)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
   at Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.EntityFrameworkCoreXmlRepository`1.<GetAllElements>g__GetAllElementsCore|3_0()+MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.EntityFrameworkCoreXmlRepository`1.GetAllElements()
   at Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager.GetAllKeys()
   at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider.CreateCacheableKeyRingCore(DateTimeOffset now, IKey keyJustAdded)
   at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider.Microsoft.AspNetCore.DataProtection.KeyManagement.Internal.ICacheableKeyRingProvider.GetCacheableKeyRing(DateTimeOffset now)
   at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider.GetCurrentKeyRingCore(DateTime utcNow, Boolean forceRefresh)
   
   
   
   
   
   
ERROR 2022-08-23 10:06:37,251 [orker] Mvc.ExceptionHandling.AbpExceptionFilter - An error occurred while trying to encrypt the provided data. Refer to the inner exception for more information. For more information go to http://aka.ms/dataprotectionwarning
System.Security.Cryptography.CryptographicException: An error occurred while trying to encrypt the provided data. Refer to the inner exception for more information. For more information go to http://aka.ms/dataprotectionwarning
 ---> Castle.MicroKernel.Handlers.HandlerException: Can't create component 'MyApp.EntityFrameworkCore.MyAppDbContext' as it has dependencies to be satisfied.

'MyApp.EntityFrameworkCore.MyAppDbContext' is waiting for the following dependencies:
- Service 'Microsoft.EntityFrameworkCore.DbContextOptions`1[[MyApp.EntityFrameworkCore.MyAppDbContext, MyApp.EntityFrameworkCore, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' which was not registered.

   at Castle.MicroKernel.Handlers.DefaultHandler.AssertNotWaitingForDependency()
   at Castle.MicroKernel.Handlers.DefaultHandler.ResolveCore(CreationContext context, Boolean requiresDecommission, Boolean instanceRequired, Burden& burden)
   at Castle.MicroKernel.Handlers.DefaultHandler.Resolve(CreationContext context, Boolean instanceRequired)
   at Castle.MicroKernel.DefaultKernel.ResolveComponent(IHandler handler, Type service, Arguments additionalArguments, IReleasePolicy policy, Boolean ignoreParentContext)
   at Castle.MicroKernel.DefaultKernel.Castle.MicroKernel.IKernelInternal.Resolve(Type service, Arguments arguments, IReleasePolicy policy, Boolean ignoreParentContext)
   at Castle.MicroKernel.DefaultKernel.Resolve(Type service, Arguments arguments)
   at Castle.Windsor.MsDependencyInjection.ScopedWindsorServiceProvider.GetServiceInternal(Type serviceType, Boolean isOptional)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
   at Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.EntityFrameworkCoreXmlRepository`1.<GetAllElements>g__GetAllElementsCore|3_0()+MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.EntityFrameworkCoreXmlRepository`1.GetAllElements()
   at Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager.GetAllKeys()
   at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider.CreateCacheableKeyRingCore(DateTimeOffset now, IKey keyJustAdded)
   at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider.Microsoft.AspNetCore.DataProtection.KeyManagement.Internal.ICacheableKeyRingProvider.GetCacheableKeyRing(DateTimeOffset now)
   at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider.GetCurrentKeyRingCore(DateTime utcNow, Boolean forceRefresh)
   at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider.GetCurrentKeyRing()
   at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.Protect(Byte[] plaintext)
   --- End of inner exception stack trace ---
   at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.Protect(Byte[] plaintext)
   at Microsoft.AspNetCore.Antiforgery.DefaultAntiforgeryTokenSerializer.Serialize(AntiforgeryToken token)
   at Microsoft.AspNetCore.Antiforgery.DefaultAntiforgery.Serialize(IAntiforgeryFeature antiforgeryFeature)
   at Microsoft.AspNetCore.Antiforgery.DefaultAntiforgery.GetAndStoreTokens(HttpContext httpContext)
   at Abp.AspNetCore.Security.AntiForgery.AbpAspNetCoreAntiForgeryManager.GenerateToken()
   at Abp.Web.Security.AntiForgery.AbpAntiForgeryManagerAspNetCoreExtensions.SetCookie(IAbpAntiForgeryManager manager, HttpContext context, IIdentity identity, CookieOptions cookieOptions)
   at MyApp.Web.Host.Controllers.AntiForgeryController.SetCookie() in C:\repo\MyApp\MyApp.Core\src\MyApp.Web.Host\Controllers\AntiForgeryController.cs:line 27
   at Microsoft.Extensions.Internal.ObjectMethodExecutor.<>c__DisplayClass33_0.<WrapVoidMethod>b__0(Object target, Object[] parameters)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.VoidResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Logged|12_1(ControllerActionInvoker invoker)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextExceptionFilterAsync>g__Awaited|26_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)

Issue Analytics

  • State:closed
  • Created a year ago
  • Comments:8 (3 by maintainers)

github_iconTop GitHub Comments

1reaction
mkamranaslamcommented, Sep 8, 2022

@kzmyvr for now redis is not an option for me.

0reactions
ismcagdascommented, Oct 19, 2022

We will create a blog post about this, so closing this issue for now.

Read more comments on GitHub >

github_iconTop Results From Across the Web

Key storage providers in ASP.NET Core
Blobs package allows storing data protection keys in Azure Blob ... The generic parameter, TContext , must inherit from DbContext and ...
Read more >
Entity Framework Core - PersistKeysToDbContext #9864
The table does not get created automatically should there be some OnModelCreating logic in MyKeysContext , or SQL to generate the table.
Read more >
ASP.NET Core Data Protection Key stored to ...
I have Setup a Database for developing that is available in the local network. I implemented the Dataprotection Api to encrypt some of...
Read more >
How to distribute Data Protection keys with an ASP.NET ...
The Microsoft.AspNetCore.DataProtection.StackExchangeRedis package allows you to store data protection keys in a Redis cache backed by a list entry. This list ...
Read more >
ASP.NET Core 6.0 - Data Protection Keys
PersistKeysToDbContext. Keys are persisted to the HKLM registry in a special registry key that's ACLed only to the worker process account. Keys ......
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found