【发布时间】:2020-05-21 14:06:10
【问题描述】:
我们在将 IdentityServer4 (2.5.3 - 3.1.0) 升级到 Core 3.1(从 2.2)时遇到错误。突然发出的令牌没有正确的签名。我们没有改变签名算法;版本之间仍然使用相同的 .PFX 证书。
var idSrvBuilder = services.AddIdentityServer(opts =>
{
opts.Events.RaiseErrorEvents = true;
opts.Events.RaiseFailureEvents = true;
opts.Events.RaiseInformationEvents = true;
opts.Events.RaiseSuccessEvents = true;
if (_env.IsProduction())
{
opts.PublicOrigin = Configuration["Globals:IdentityURL"];
}
}).AddSigningCredential(new X509Certificate2(Configuration["Cert:Path"], Configuration["Cert:Password"]));
将 OWIN 中间件“UseIdentityServerBearerTokenAuthentication”用于较旧的 API 时,如果 ValidationMode 是 Local,但如果它直接针对 IdentityServer 进行验证(使用 ValidationMode ValidationEndpoint)则不会失败。 API 只会返回“未经授权”,但可以使用旧令牌(相同的证书对其进行签名!)
app.UseIdentityServerBearerTokenAuthentication(new IdentityServer3.AccessTokenValidation.IdentityServerBearerTokenAuthenticationOptions
{
Authority = AppSettings.Authority,
ClientId = AppSettings.ApiName,
ClientSecret = AppSettings.ApiSecret,
EnableValidationResultCache = false,
ValidationMode = IdentityServer3.AccessTokenValidation.ValidationMode.Local
});
看看版本之间发行的令牌有一个明显的区别:
旧的(已移除的有效负载):
eyJhbGciOiJSUzI1NiIsImtpZCI6IjZCMTM4RUIzMUE4OUExQTdEQTdCNkRGNzMwOTRGMzIzREJFNzhCNjYiLCJ0eXAiOiJKV1QiLCJ4NXQiOiJheE9Pc3hxSm9hZmFlMjMzTUpUekk5dm5pMlkifQ.U3unxhW6act8fQLCLAYBJAZ-lIMiKaghVEUdA3b7iM0mI0UqGmYgYw05SvVXTAT8ZNQPuq0D-97d0Z6VVBC2wH7VAl0daF6sYJyuSUEtDiBPttNQ9MsGBNjcN1HABZ0nv-z_lgG2Z9sgp4blCvc7N8xOsja-kuk6m06I7iOfS7O_YKPtTAXA10OCzdtiJbhYijeTFsBJaWf5-J3XJCtqpp-MGXCboE0gQIlvysKz5_CRaaKYptczw-cTX3sgRIhfWn2VxVujhH7JKeSJan52X-fQ4T47PWuVcWNOrcWheeLAbVDQU1U9DiLVVua3BasnIku5Rx4XcLnqCaokCiWZhg
带有以下令牌头:
{
"alg": "RS256",
"kid": "6B138EB31A89A1A7DA7B6DF73094F323DBE78B66",
"typ": "JWT",
"x5t": "axOOsxqJoafae233MJTzI9vni2Y"
}
新:
eyJhbGciOiJSUzI1NiIsImtpZCI6IjZCMTM4RUIzMUE4OUExQTdEQTdCNkRGNzMwOTRGMzIzREJFNzhCNjYiLCJ0eXAiOiJhdCtqd3QiLCJ4NXQiOiJheE9Pc3hxSm9hZmFlMjMzTUpUekk5dm5pMlkifQ.RmKHRk44c6Ele-VbB8lhNsmmcvKFludaWypuBzQzYqR7AEIuLXAuZ-N4I9ooVvQLHisBJT4qA4epEK9xdtf0ELpcvfEe3Yc2dkJnKp_rjJSRuhqyNHD0hPAoxqVSWHhfaLxLiL7_17mklqLDEqwdXANnA2YCO-Q-9wqGALZorywHYucr0X9m2hYm1oVgXPitG_TAqysYVNnLCHVGZRNE7Xmug0XhkJXzQ8RpZuSHlDHFlT2cgb7psEb4NUfA8v5-q-LyqfPDk4xJZX2ia53SoPpiJbByFgscYF4xk54SkkcB9EOxCCsR-IYHJAmyYkhGRpBVWY5xU_9qb2ioIwkzZg
带有以下标题:
{
"alg": "RS256",
"kid": "6B138EB31A89A1A7DA7B6DF73094F323DBE78B66",
"typ": "at+jwt",
"x5t": "axOOsxqJoafae233MJTzI9vni2Y"
}
我猜问题是新令牌中的"typ" 是"at+jwt"?那是什么意思?我查看了 IdentityServers 版本、Github 问题、谷歌搜索、stackoverflow,但似乎没有人注意到神秘的新 "at+jwt" "typ"。
这会导致问题吗?如何指示我的新版本发布标准 JWT?还有什么奇怪的at+jwt?
【问题讨论】:
-
这称为explicit typing。您可以通过使用 IdentityServer Options 覆盖该值来禁用此行为。
-
谢谢!似乎已经解决了问题
-
另外,刚刚找到这个issue。
标签: asp.net-core oauth-2.0 identityserver4 openid-connect