我們正在使用IdentityServer進行身份驗證,並且正在使用JwtSecurityTokenHandler ValidateToken驗證訪問令牌。這用於正常工作,但是在我們將客戶端應用程序升級到ASP.NET Core 1.0 RTM(來自RC1)之後,驗證失敗。收到的錯誤是:無法使用IdentityServer驗證AccessToken
IDX10501: Signature validation failed. Unable to match 'kid'
當我看到使用的證書的KeyID和令牌的孩子,我可以看到他們是不同的。我檢查了IdentityServer jwks-endpoint以檢查我是否擁有正確的證書,並注意到孩子和證書密鑰ID也與該端點不同。據我所知,他們應該是一樣的?
任何想法爲什麼代碼在升級過程中破壞了,因爲證書,令牌和IdentityServer仍然是相同的,只有客戶端應用程序內核已升級。
編輯(更多信息)
我懷疑ValidateIssuerSigningKey默認爲false和鍵之前(因此它的工作)甚至還沒有被驗證。現在看來ValidateIssuerSigningKey被忽略了(這是不好的做法?),因此驗證失敗。
workaround /修正
通過手動設置IssuerSigningKeyResolver,並給予重點在驗證明確地使用,修復該問題,並驗證通過。不知道該解決方法有多好,爲什麼默認不起作用,但至少我現在可以繼續。
簡化代碼...
new JwtSecurityTokenHandler().ValidateToken(authTokens.AccessToken,
new TokenValidationParameters()
{
IssuerSigningKeys = keys,
ValidAudience = audience,
ValidIssuer = issuer,
IssuerSigningKeyResolver = (arbitrarily, declaring, these, parameters) => new List<X509SecurityKey> { securityKey }
}, out securityToken);
更詳細地描述你正在運行什麼和你更新了什麼。也許與https://github.com/IdentityServer/IdentityServer3/issues/3040 – leastprivilege
有關聽起來像是同樣的問題。無論如何,我通過手動設置IssuerSigningKeyResolver並明確給出了驗證中使用的密鑰來解決問題。我仍然想知道爲什麼默認不起作用,但至少我是通過這個修補程序來處理它的。 –
我們得到了同樣的錯誤,但是我們的問題是發行人和權威網站有不同的框架。 https:// myserver/sts和https:// myserver/Sts – Larsi