2016-07-07 98 views
4

我們正在使用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); 
+1

更詳細地描述你正在運行什麼和你更新了什麼。也許與https://github.com/IdentityServer/IdentityServer3/issues/3040 – leastprivilege

+1

有關聽起來像是同樣的問題。無論如何,我通過手動設置IssuerSigningKeyResolver並明確給出了驗證中使用的密鑰來解決問題。我仍然想知道爲什麼默認不起作用,但至少我是通過這個修補程序來處理它的。 –

+2

我們得到了同樣的錯誤,但是我們的問題是發行人和權威網站有不同的框架。 https:// myserver/sts和https:// myserver/Sts – Larsi

回答

0

客戶和API應該是指IdentityServer的同一個實例。我們在Azure中運行IdentityServerHost,它具有不同的插槽(主要和暫存)以及兩個應用程序不一致地指向不同的插槽。客戶端收到由IdSrv主要提供商發佈的訪問令牌並將其傳遞給API,該API期望來自不同提供商的IdSrv分段。 API驗證它並返回錯誤。

問題是,errror沒有提示問題的實際原因。 MS應該提供更詳細的錯誤信息來幫助調試。 當前錯誤消息不足以識別原因。