1

既存のシステム

Identity Server 4 を使用して、Google、Azure、またはその他の外部プロバイダーとのシングル サインオン機能を問題なく提供しています。クライアントの詳細と権限 URL またはディスコ URL (例: .well-known/openid-configuration) を追加するだけで、すべてが期待どおりに機能します。

シナリオ

私たちの外部 ID プロバイダーの 1 つは、公開の Discovery Document の URL を提供することはできず、内部でのみ非公開にしたと述べています。次に、Json ファイル (その URL によって提供される正確な json テキストを含む) として提供されました。そのため、その json ファイルの値を使用して、 および を使用して、これらすべてのエンドポイント URL と設定を手動で設定しようとしていAddOpenIdConnectますOpenIdConnectConfiguration

Authorize リクエストの外部プロバイダーに正しくリダイレ​​クトされ、外部システムにサインインできます。しかし、リクエストが Idsrv4 に戻ってきたとき、id_token. を取得してSecurityTokenSignatureKeyNotFoundExceptionいます。設定しようとしましたJwksUriが、まだ運がありません。

Demo Identity サーバーを使用して同じ動作を再現することができました。以下を参照してください。

.AddOpenIdConnect("manualidsrv", "IdentityServer Manual", options =>
            {
                options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
                options.SignOutScheme = IdentityServerConstants.SignoutScheme;

                options.Authority = "https://demo.identityserver.io/";
                options.ClientId = "login";
                options.ResponseType = "id_token";
                options.SaveTokens = true;

                options.Configuration = new OpenIdConnectConfiguration
                {
                    Issuer = "https://demo.identityserver.io",
                    JwksUri = "https://demo.identityserver.io/.well-known/openid-configuration/jwks",
                    AuthorizationEndpoint = "https://demo.identityserver.io/connect/authorize",
                    TokenEndpoint = "https://demo.identityserver.io/connect/token",
                    UserInfoEndpoint = "https://demo.identityserver.io/connect/userinfo",
                    EndSessionEndpoint = "https://demo.identityserver.io/connect/endsession",
                    ResponseTypesSupported =
                    {
                        "code",
                        "token",
                        "id_token",
                        "id_token token",
                        "code id_token",
                        "code token",
                        "code id_token token"
                    },
                    GrantTypesSupported = { 
                        "authorization_code",
                        "client_credentials",
                        "refresh_token",
                        "implicit",
                        "password",
                        "urn:ietf:params:oauth:grant-type:device_code"
                    },
                    ResponseModesSupported =
                    {
                        "form_post",
                        "query",
                        "fragment"
                    },
                    IdTokenSigningAlgValuesSupported = { "RS256" },
                    
            };

私たちが得ているエラーは

SecurityTokenSignatureKeyNotFoundException: IDX10501: Signature validation failed. Unable to match keys:
kid: '3BA75FA392E4DAFAC2737B5B4644AA85',
token: '{"alg":"RS256","kid":"3BA75FA392E4DAFAC2737B5B4644AA85","typ":"JWT"}.{"nbf":1596656241,"exp":1596656541,"iss":"https://demo.identityserver.io","aud":"login","nonce":"637322530390217907.xxx","iat":1596656241,"s_hash":"exiANrEFoXVDwA5BK1mGTg","sid":"D90FD8D4FA73AD590E3C53155375EA49","sub":"1","auth_time":1596652196,"idp":"local","name":"Alice Smith","given_name":"Alice","family_name":"Smith","email":"AliceSmith@email.com","email_verified":true,"website":"http://alice.com","amr":["pwd"]}'.

jwksUri: https://demo.identityserver.io/.well-known/openid-configuration/jwksを確認しようとしましたが、正しい子供 '3BA75FA392E4DAFAC2737B5B4644AA85' が表示されます。

そのため、構成を手動で設定すると、Idsrv4 がこれらのキーを正しくロードしていないように思えます。

ConfigurationManager次のように使用して手動で SigningKeys をロードすることをお勧めします。

new ConfigurationManager<OpenIdConnectConfiguration>($"DiscoveryEndpointUrl", new OpenIdConnectConfigurationRetriever());

ただし、そのエンドポイント URL にアクセスできないため、うまくいきません。

Idsrv に jwksUri からキーをロードさせるか、手動でキーを提供させる方法はありますか?

この署名キーの例外を解決する方法を提案していただけますか?

4

1 に答える 1