Предоставление расширений - недопустимое делегирование типа предоставления - Identity Server 4 .NET Core 2.2 - PullRequest
1 голос
/ 10 октября 2019

Я пытаюсь выяснить, как реализовать тип предоставления delegation в сочетании с client credentials, следуя учебному пособию из ЗДЕСЬ , которое является буквально одной страницей, поскольку у меня есть ресурс API1вызов другого ресурса API2.

Я реализовал IExtensionGrantValidator, скопировал код из документов, используя предоставленное ими имя класса, и добавил client с типом предоставления delegation. Однако я не уверен, где и как вызвать этот метод ниже, сначала я вызывал его из client и пытался передать JWT, который я первоначально получил для вызова API1, в метод DelegateAsync, но я продолжал получать bad request

В API 1 теперь вы можете создать полезную нагрузку HTTP самостоятельно или использовать вспомогательную библиотеку IdentityModel:

    public async Task<TokenResponse> DelegateAsync(string userToken)
    {
        var payload = new
        {
            token = userToken
        };

        // create token client
        var client = new TokenClient(disco.TokenEndpoint, "api1.client", "secret");

        // send custom grant to token endpoint, return response
        return await client.RequestCustomGrantAsync("delegation", "api2", payload);
    }

Итак, я попытался из API1 запросить токенв методе с именем GetAPI2Response, который пытается вызвать метод в API2:

        [HttpGet]
        [Route("getapi2response")]
        public async Task<string> GetApi2Response()
        {
            var client = new HttpClient();

            var tokenResponse = await client.RequestTokenAsync(new TokenRequest
            {
                Address = "http://localhost:5005/connect/token",
                GrantType = "delegation",
                ClientId = "api1_client",
                ClientSecret = "74c4148e-70f4-4fd9-b444-03002b177937",

                Parameters = { { "scope", "stateapi" } }
            });

            var apiClient = new HttpClient();
            apiClient.SetBearerToken(tokenResponse.AccessToken);

            var response = await apiClient.GetAsync("http://localhost:6050/api/values");

            if (!response.IsSuccessStatusCode)
            {
                Debug.WriteLine(response.StatusCode);
            }
            else
            {
                var content = await response.Content.ReadAsStringAsync();

                return content;
            }
            return "failed";
        }

Однако это возвращается при отладке invalid grant type. Как ни странно, я заметил, что при запуске IDSRV код в методе IExtensionGrantValidator не срабатывает, пока вы не нажмете ссылку для discovery docs, тогда она отобразится как grant type

Я, очевидно, что-то делаюнеправильно, поскольку я не включил вышеупомянутый DelegateAsync метод из документации, так как мне не ясно, куда он идет.

1 Ответ

1 голос
/ 10 октября 2019

Документы кажутся немного устаревшими. С фактическими методами расширения должно быть что-то вроде:

var tokenResponse = await client.RequestTokenAsync(new TokenRequest
{
    Address = "http://localhost:5005/connect/token",
    GrantType = "delegation",
    ClientId = "api1_client",
    ClientSecret = "74c4148e-70f4-4fd9-b444-03002b177937",
    Parameters = new Dictionary<string, string>{{ "token", userToken }, { "scope", "stateapi" } }
})

Вы уже реализовали это, но забыли добавить начальный токен. Когда вы извлекаете его из GetApi2Response(), оно может стать вашим DelegateAsync.

. Тогда ваша конфигурация клиента в Identityserver должна содержать делегирование GrantType для api1_client ,Также не забудьте о регистрации:

services.AddIdentityServer().AddExtensionGrantValidator<YourIExtensionGrantValidatorImpl>()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...