asp.net-core - 生产环境中的 Identityserve 4:“IDX10501:签名验证失败。无法匹配密钥”
问题描述
我有一个 3 层 .NET 核心应用程序:
- 身份服务器 4
- 一个 API
- 西装外套应用
在我的本地/开发计算机上,一切正常。但是,我已将所有内容安装到真实服务器中,然后出现了一个问题。
我登录到应用程序,玩,然后等待一段时间(不知道多少),然后当我尝试使用该应用程序时,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();
}
解决方案
推荐阅读
- css - 如何使我的@media 函数与设备像素比兼容
- php - 在随机 Doctrine DQL 查询中补充 DATETIME 字段
- javascript - 在 SPA(反应)中提交带有数据的 form.html?
- reactjs - 尝试从 React Web 应用程序获取数据并进入 Electron 应用程序以显示徽章计数
- jquery - Jquery 在 elecron.js 中无法正常工作
- php - Laravel - 完成后仍在内存中的作业处理方法
- java - Snackbar.setAnchorView(不工作);
- javascript - 分配失败 - JavaScript 堆内存不足
- c# - 使用“.NETFramework,Version=v4.6.1”恢复包“MyPackage 1.0.1”,自定义 nuget 包上的警告
- c - 当该函数位于另一个文件夹中的另一个 c 程序中时,如何使用 gdb ddebugger 进入该函数?