Identityserve 4 in production env : "IDX10501: Signature validation failed. Unable to match key"

Viewed 808

I have a 3 tier .NET core application with:

  • identityserver 4
  • an API
  • a blazer app

On my local/dev computer, everything works fine. But, I have installed everything into a real server and then I have an issue that appears.

I log into the application, play with, then I wait some time (don't know how much) and then when I try to use the app, the Blazor app crash because of this code :

bool isAuthenticated = await _authenticationVerifier.IsAuthenticatedAsync();
if (isAuthenticated)
    User = await _userAppService.GetCurrentUserAsync();

The 'isAuthenticated' is true, in fact my cookies look good, but the Blazor app is no more authorized to connect to the API server.

I got the following error message on the API server:

Bearer was not authenticated. Failure message: IDX10501: Signature validation failed. Unable to match key:
kid: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'.
Exceptions caught: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'.
token: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'.

What is strange is that it work for some time, then after some time (1/2 days), I got this crash.

I don't know what to check and/or how to debug this issue. I'm looking for a solution since weeks :-(

I join some code:

On the API Server:

private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration)
{
    context.Services.AddAuthentication("Bearer")
        .AddIdentityServerAuthentication(options =>
        {
            options.Authority = configuration["AuthServer:Authority"];
            options.RequireHttpsMetadata = true;
            options.ApiName = "MyAppName";
        });
}

On the Blazor (Server side Blazor):

    private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration)
    {
        context.Services.AddAuthentication(options =>
        {
            options.DefaultScheme = "Cookies";
            options.DefaultChallengeScheme = "oidc";
        })
        .AddCookie("Cookies", options =>
        {
            options.ExpireTimeSpan = TimeSpan.FromDays(ApplicationConstants.LoginCookieExpirationDelay);
        })
        .AddOpenIdConnect("oidc", options =>
        {
            options.Authority = configuration["AuthServer:Authority"];
            options.RequireHttpsMetadata = true;
            options.ResponseType = OpenIdConnectResponseType.CodeIdToken;

            options.ClientId = configuration["AuthServer:ClientId"];
            options.ClientSecret = configuration["AuthServer:ClientSecret"];

            options.SaveTokens = true;
            options.GetClaimsFromUserInfoEndpoint = true;

            options.Scope.Add("role");
            options.Scope.Add("email");
            options.Scope.Add("phone");
            options.Scope.Add("SoCloze");

            options.ClaimActions.MapAbpClaimTypes();
        });

        context.Services.AddSingleton<BlazorServerAuthStateCache>();
        context.Services.AddScoped<AuthenticationStateProvider, BlazorServerAuthState>();

        context.Services.AddScoped<AuthenticationVerifier>();
    }

On the IdentityServer 4 side:

    // Identity cookie expiration
    context.Services.ConfigureApplicationCookie(options =>
    {
        options.Cookie.Name = ".AspNetCore.Identity.Application";                
        options.ExpireTimeSpan = TimeSpan.FromDays(ApplicationConstants.LoginCookieExpirationDelay);
    });

    var clientConfig = context.Services.GetConfiguration().GetSection("IdentityServer:Clients");
    context.Services
        .AddAuthentication(options =>
        {
            options.DefaultScheme = IdentityConstants.ApplicationScheme;
            options.DefaultSignInScheme = IdentityConstants.ExternalScheme;
            options.RequireAuthenticatedSignIn = true;
        })
        .AddFacebook("Facebook", options =>
        {
            options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
            options.AppId = clientConfig["Facebook:ClientId"];
            options.AppSecret = clientConfig["Facebook:ClientSecret"];
            options.Fields.Add("picture");
        })
        .AddIdentityCookies();
}
0 Answers
Related