AddOpenIdConnect с ручной настройкой - SecurityTokenSignatureKeyNotFoundException - PullRequest
0 голосов
/ 05 августа 2020

Существующие системы

Мы используем Identity Server 4, чтобы без проблем предоставлять функцию единого входа для Google, Azure или других внешних поставщиков. Все, что нам нужно сделать, это добавить сведения о клиенте и URL-адрес авторизации или URL-адрес дискотеки (например, .well-known/openid-configuration), и все будет работать должным образом.

Сценарий

Один из наших Внешний поставщик удостоверений заявил, что не может предоставить URL-адрес publi c Discovery Document, и сделал его закрытым только для внутреннего пользования. Затем они предоставили файл Json (который содержит точные тексты json, предоставленные этим URL-адресом). Итак, мы пытаемся использовать значения в этом файле json, чтобы установить все эти URL-адреса и настройки конечных точек вручную, используя AddOpenIdConnect и OpenIdConnectConfiguration.

Он правильно перенаправляет внешнему провайдеру для запросов авторизации и мы можем войти во внешнюю систему. Но когда запрос возвращается к нашему 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 не загружает эти ключи правильно, если мы устанавливаем конфигурацию вручную.

Есть некоторые предложения загрузить SigningKeys вручную, используя ConfigurationManager, например: Однако, поскольку у нас нет доступа к этому URL-адресу конечной точки, он не работает для нас.

Есть ли способ заставить Idsrv загружать ключи из jwksUri или предоставлять ключи вручную?

Не могли бы вы предложить устранить это исключение ключа подписи?

1 Ответ

0 голосов
/ 06 августа 2020

Обходной путь, возможно, состоит в том, чтобы поместить документ обнаружения от поставщика в документ JSON и просто включить его в свой IdentityServer в качестве ресурса stati c ?. А затем просто добавьте ссылку на эту stati c конечную точку в вашей конфигурации?

Я сомневаюсь, что IdentityServer заботится о том, размещен этот документ локально или нет.

...