首页 > 解决方案 > 生产环境中的 Identityserve 4:“IDX10501:签名验证失败。无法匹配密钥”

问题描述

我有一个 3 层 .NET 核心应用程序:

在我的本地/开发计算机上,一切正常。但是,我已将所有内容安装到真实服务器中,然后出现了一个问题。

我登录到应用程序,玩,然后等待一段时间(不知道多少),然后当我尝试使用该应用程序时,Blazor 应用程序由于以下代码而崩溃:

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

'isAuthenticated' 是真的,事实上我的 cookie 看起来不错,但是 Blazor 应用程序不再被授权连接到 API 服务器。

我在 API 服务器上收到以下错误消息:

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.]'.

奇怪的是它工作了一段时间,然后过了一段时间(1/2天),我得到了这个崩溃。

我不知道要检查什么和/或如何调试此问题。几周以来我一直在寻找解决方案:-(

我加入了一些代码:

在 API 服务器上:

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

在 Blazor(服务器端 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>();
    }

在 IdentityServer 4 方面:

    // 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();
}

标签: asp.net-corecookiesasp.net-identityidentityserver4bearer-token

解决方案


推荐阅读