これを解決し、Keycloakを通常通り使用する必要があります: これはバグとして報告されており、ライブラリ作成者/管理者がもうこれで作業していないため、修正する必要がありますローカルコピーを作成し、NuGetパッケージの代わりに使用します。
背景: Keycloakは、例えばトークンのnbf
またはexp
のような時間基準を必要とするすべての属性、でUTC時刻を使用しています。 Accessトークンは通常5分間有効であるため、マシンがUTC時間と一致するタイムゾーンにある場合を除いて、5分間の制限を行うことはできません。 あなたはGitHubのhereから、ライブラリコードのコピーをダウンロードして、最初のプロジェクトを閲覧することができますライブラリと 問題は、それはあなたがDateTime.UtcNow
実装に手動でそれを変更する必要がDateTime.Now
とトークンで時間を比較していることです解決策:KeycloakIdentityModel
は、タスクが配置されているファイルに:KeycloakIdentity.cs
。 443行目に行くと、これは比較タスクGetClaimsAsync
の始まりです。
タスク内にはif文があり、DateTime.Now
をすべてDateTime.UtcNow
に変更します。結果は次のようになります。
// Check to update cached claims, but not if refresh token is missing (as in bearer mode)
if ((_kcClaims == null || _accessToken.ValidTo <= DateTime.UtcNow) && _refreshToken != null)
{
// Validate refresh token expiration
if (_refreshToken.ValidTo <= DateTime.UtcNow)
throw new Exception("Both the access token and the refresh token have expired");
// Load new identity from token endpoint via refresh token
await RefreshIdentity(_refreshToken.RawData);
}
変更は、そのソリューションを再構築して、〜\ SRC \ Owin.Securityへの溶液の物理的なフォルダを参照した後、ライン439および442
をで開催されました.Keycloak \ bin \ Debugの両方で変更された日付が実際の時刻に似ていることを確認し、両方のファイル KeycloakIdentityModel.dll
とOwin.Security.Keycloak.dll
を簡単なディレクトリにコピーします(これは必須ではありませんが、簡単です)。
解決策から、ソリューションエクスプローラで参照ノードを右クリックし、参照の追加を選択して、参照から両方を削除し、新しいものを追加します。保存した場所を参照して追加してください。この方法で正しく機能するはずです。
ありがとうございます。私たちはしばらくの間テストを中止しましたが、来週からこれに戻ります。 – griegs