question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

.NET 7 Blocker - Method get_ServerSideSessions in type ApiAuthorizationDbContext from assembly IdentityServer does not have an implementation

See original GitHub issue

Is there an existing issue for this?

  • I have searched the existing issues

Describe the bug

When trying to build .Net 7 (Angular and WebAPI )application we are getting

`13>Method “get_ServerSideSessions” in type “Microsoft.AspNetCore.ApiAuthorization.IdentityServer.ApiAuthorizationDbContext"1” from assembly “Microsoft.AspNetCore.ApiAuthorization.IdentityServer, Version=7.0.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60” does not have an implementation.)

13> —> System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. 13>Method “get_ServerSideSessions” in type “Microsoft.AspNetCore.ApiAuthorization.IdentityServer.ApiAuthorizationDbContext"1” from assembly “Microsoft.AspNetCore.ApiAuthorization.IdentityServer, Version=7.0.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60” does not have an implementation.

13> at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module) 13> at Microsoft.AspNetCore.Mvc.Controllers.ControllerFeatureProvider.PopulateFeature(IEnumerable"1 parts, ControllerFeature feature) 13> at Microsoft.AspNetCore.Mvc.ApplicationParts.ApplicationPartManager.PopulateFeature[TFeature](TFeature feature) 13> at Microsoft.AspNetCore.Mvc.ApplicationModels.ControllerActionDescriptorProvider.GetControllerTypes() 13> at Microsoft.AspNetCore.Mvc.ApplicationModels.ControllerActionDescriptorProvider.GetDescriptors() 13> at Microsoft.AspNetCore.Mvc.ApplicationModels.ControllerActionDescriptorProvider.OnProvidersExecuting(ActionDescriptorProviderContext context) 13> at Microsoft.AspNetCore.Mvc.Infrastructure.DefaultActionDescriptorCollectionProvider.UpdateCollection() 13> at Microsoft.AspNetCore.Mvc.Infrastructure.DefaultActionDescriptorCollectionProvider.Initialize() 13> at Microsoft.AspNetCore.Mvc.Infrastructure.DefaultActionDescriptorCollectionProvider.GetChangeToken() 13> at Microsoft.Extensions.Primitives.ChangeToken.OnChange(Func"1 changeTokenProducer, Action changeTokenConsumer) 13> at Microsoft.AspNetCore.Mvc.Routing.ActionEndpointDataSourceBase.Subscribe() 13> at Microsoft.AspNetCore.Builder.ControllerEndpointRouteBuilderExtensions.GetOrCreateDataSource(IEndpointRouteBuilder endpoints) 13> at Microsoft.AspNetCore.Builder.ControllerEndpointRouteBuilderExtensions.MapControllerRoute(IEndpointRouteBuilder endpoints, String name, String pattern, Object defaults, Object constraints, Object dataTokens) 13> at HomePlanner.Server.Application.Program.Main(String[] args) in D:\PROJEKTY\HomePlanner\HomePlanner.Server\HomePlanner.Server.Application\Program.cs:line 57 13> at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) 13> at System.Reflection.MethodInvoker.Invoke(Object obj, IntPtr* args, BindingFlags invokeAttr) 13>System.TypeLoadException: Method “get_ServerSideSessions” in type “Microsoft.AspNetCore.ApiAuthorization.IdentityServer.ApiAuthorizationDbContext"1” from assembly “Microsoft.AspNetCore.ApiAuthorization.IdentityServer, Version=7.0.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60” does not have an implementation. 13> — End of inner exception stack trace — 13> at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) 13> at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken) 13> at System.Threading.Tasks.Task.Wait() 13> at NSwag.Commands.ServiceProviderResolver.GetServiceProviderWithHostFactoryResolver(Assembly assembly) in //src/NSwag.Commands/HostApplication.cs:line 158 13> at NSwag.Commands.ServiceProviderResolver.GetServiceProvider(Assembly assembly) in //src/NSwag.Commands/HostApplication.cs:line 70 13> at NSwag.Commands.Generation.AspNetCore.AspNetCoreToOpenApiGeneratorCommandEntryPoint.Process(String commandContent, String outputFile, String applicationName) in //src/NSwag.Commands/Commands/Generation/AspNetCore/AspNetCoreToOpenApiGeneratorCommandEntryPoint.cs:line 27 13> at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) 13> at System.Reflection.MethodInvoker.Invoke(Object obj, IntPtr* args, BindingFlags invokeAttr) 13> — End of inner exception stack trace — 13> at System.Reflection.MethodInvoker.Invoke(Object obj, IntPtr* args, BindingFlags invokeAttr) 13> at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 13> at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) 13> at NSwag.AspNetCore.Launcher.Program.Main(String[] args) in //src/NSwag.AspNetCore.Launcher/Program.cs:line 132 13>System.InvalidOperationException: Swagger generation failed with non-zero exit code “1”. 13> at NSwag.Commands.Generation.AspNetCore.AspNetCoreToSwaggerCommand.RunAsync(CommandLineProcessor processor, IConsoleHost host) in //src/NSwag.Commands/Commands/Generation/AspNetCore/AspNetCoreToOpenApiCommand.cs:line 231 13> at NSwag.Commands.NSwagDocumentBase.GenerateSwaggerDocumentAsync() in //src/NSwag.Commands/NSwagDocumentBase.cs:line 275 13> at NSwag.Commands.NSwagDocument.ExecuteAsync() in //src/NSwag.Commands/NSwagDocument.cs:line 81 13> at NSwag.Commands.Document.ExecuteDocumentCommand.ExecuteDocumentAsync(IConsoleHost host, String filePath) in //src/NSwag.Commands/Commands/Document/ExecuteDocumentCommand.cs:line 85 13> at NSwag.Commands.Document.ExecuteDocumentCommand.RunAsync(CommandLineProcessor processor, IConsoleHost host) in //src/NSwag.Commands/Commands/Document/ExecuteDocumentCommand.cs:line 39 13> at NConsole.CommandLineProcessor.ProcessSingleAsync(String[] args, Object input) 13> at NConsole.CommandLineProcessor.ProcessAsync(String[] args, Object input) 13> at NSwag.Commands.NSwagCommandProcessor.ProcessAsync(String[] args) in //src/NSwag.Commands/NSwagCommandProcessor.cs:line 61`

We are using the latest versions of the packages (there is nothing to update)

<PackageReference Include="AutoMapper" Version="12.0.0" />
<PackageReference Include="AutoMapper.Collection" Version="9.0.0" />
<PackageReference Include="AutoMapper.Collection.EntityFrameworkCore" Version="9.0.0" />
<PackageReference Include="AutoMapper.Extensions.ExpressionMapping" Version="6.0.2" />
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.0" />

<PackageReference Include="Duende.IdentityServer" Version="6.2.0" />
<PackageReference Include="Duende.IdentityServer.AspNetIdentity" Version="6.2.0" />
<PackageReference Include="Duende.IdentityServer.EntityFramework" Version="6.2.0" />
<PackageReference Include="Duende.IdentityServer.Storage" Version="6.2.0" />
<PackageReference Include="FluentValidation.DependencyInjectionExtensions" Version="11.4.0" />     

<PackageReference Include="Microsoft.AspNetCore.ApiAuthorization.IdentityServer" Version="7.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="7.0.2" />
<PackageReference Include="Microsoft.AspNetCore.SpaProxy" Version="7.0.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.2"/> 
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="7.0.0" />  
...

We created this issue because previous one was not updated in laset two months (#44990 and its PR !45145)

Current state of Microsoft.AspNetCore.ApiAuthorization.IdentityServer package is blocking upgrade to .Net 7 IdentityServer 6.2

As was pointed out .Net 7 needs AutoMapper 12 (1), newest IndentityServer (6.2.0) also has supports .Net 7 and uses AutoMapper 12 but at the same time they added that ServerSideSessions DbSet (2) which is not present in ApiAuthorizationDbContext of Microsoft.AspNetCore.ApiAuthorization.IdentityServer 7.0.0 (3)

I have tried to lower the versions of Duende.IdentityServer to 6.0.4 which is last version without ServerSideSessions but then I have to lower version of AutoMapper to 11 and that results in error (“violates the constraint of type parameter ‘T’” (1)).

  1. https://github.com/AutoMapper/AutoMapper/issues/3988 https://github.com/dotnet/runtime/issues/69119
  2. https://docs.duendesoftware.com/identityserver/v6/data/operational/sessions/
  3. https://github.com/dotnet/aspnetcore/pull/45145

Expected Behavior

Application should build. Method get_ServerSideSessions in type ApiAuthorizationDbContext from assembly IdentityServer does not have an implementation error should disappear

Steps To Reproduce

Create application that uses Duende.IdentityServer (and related) 6.2.0 Microsoft.AspNetCore.ApiAuthorization.IdentityServer (and related) 7.0.2 AutoMapper (and related) 12.0.0

Exceptions (if any)

No response

.NET Version

7.0

Anything else?

No response

Issue Analytics

  • State:closed
  • Created 8 months ago
  • Reactions:1
  • Comments:6 (5 by maintainers)

github_iconTop GitHub Comments

2reactions
javiercncommented, Jan 11, 2023

@Alan468 thanks for contacting us.

Thanks for bringing this up to our attention. It fell out of our radar likely due to the holidays.

I took another chance to look at this and better understand what is going on, so here is a more detailed explanation of what is happening.

There is a way to make it work with the following steps:

  • Remove the usage of ApiAuthorizationDbContext from the app:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IPersistedGrantDbContext {

    private readonly IOptions<OperationalStoreOptions> _operationalStoreOptions;

    public ApplicationDbContext(
        DbContextOptions options,
        IOptions<OperationalStoreOptions> operationalStoreOptions)
        : base(options) {
        _operationalStoreOptions = operationalStoreOptions;
    }

    public DbSet<PersistedGrant> PersistedGrants { get; set; }

    public DbSet<DeviceFlowCodes> DeviceFlowCodes { get; set; }

    public DbSet<Key> Keys { get; set; }

    public DbSet<ServerSideSession> ServerSideSessions { get; set; }

    Task<int> IPersistedGrantDbContext.SaveChangesAsync() => base.SaveChangesAsync();

    protected override void OnModelCreating(ModelBuilder builder) {
        base.OnModelCreating(builder);
        builder.ConfigurePersistedGrantContext(_operationalStoreOptions.Value);
    }
}
  • Remove the assembly from the list of application parts:
builder.Services.AddControllersWithViews()
    .ConfigureApplicationPartManager(apm => {
        apm.ApplicationParts
        .Remove(apm.ApplicationParts.Single(ap => ap.Name == "Microsoft.AspNetCore.ApiAuthorization.IdentityServer"));
    });
  • You might need to add or recreate the migrations.

The breaking change is located in Duende.IdentityServer.EntityFramework.Storage.

Unfortunately, I do not think we can’t do anything about this out of the box, since we can’t change the public API in patch releases, but I am asking if there is an exception that can be made.

I would suggest in parallel raising this issue with the Identity Server team, as they might have a way to revert the breaking change in a future release and delay it until a major version. That would make future versions compatible with our package again.

1reaction
Alan468commented, Jan 12, 2023

Thank you @javiercn for quick response - I can also confirm that this workaround works and application starts correctly. As per seperate ticket for Duende Identity Server - I have created it for more info on the topic (https://github.com/DuendeSoftware/Support/issues/445)

Read more comments on GitHub >

github_iconTop Results From Across the Web

ASP.NET Core Web API - How to resolve Detected ...
Method 'get_ServerSideSessions' in type 'Microsoft.AspNetCore.ApiAuthorization.IdentityServer.ApiAuthorizationDbContext`1' from assembly ...
Read more >
ApiAuthorizationDbContext<TUser> Class
Database abstraction for a combined DbContext using ASP.NET Identity and Identity Server.
Read more >
What's New in .NET 7 for Authentication and Authorization
Let's explore the new .NET 7 features for improving and simplifying authentication and authorization support in .NET applications.
Read more >
Orchestrator - Identity Server Troubleshooting
There may be situations when Identity Server throws error messages containing sensitive information. For example, if the certificate used to sign the access ......
Read more >
Getting Started with IdentityServer4 and Duende IdentityServer
A beginners guide to IdentityServer and OpenID Connect, starting with an empty project and ending with a near production ready environment.
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