Отсутствует IdentityServer, требуется параметр «refresh_token» - PullRequest
0 голосов
/ 23 декабря 2019

Я пытаюсь обновить токены, но у меня возникают некоторые проблемы с IdentityServer4.

Ниже приведен мой код.

    private async Task<string> RenewTokens()
    {
        /// get the current HttpContext to access the tokens
        HttpContext httpContext = _httpContextAccessor.HttpContext;

        DiscoveryResponse discoveryResponse = await _httpClient.GetDiscoveryDocumentAsync(Constants.IDP_URL);

        /// refresh the tokens
        TokenResponse tokenResponse = await _httpClient.RequestRefreshTokenAsync(new RefreshTokenRequest
        {
            Address = discoveryResponse.TokenEndpoint,
            ClientSecret = Credentials.CLIENT_SECRET,
            ClientId = Credentials.CLIENT_ID,
            RefreshToken = "refreshed",
        });


        if (!tokenResponse.IsError)
        {
            List<AuthenticationToken> updatedTokens = new List<AuthenticationToken>
            {
                new AuthenticationToken
                {
                    Name = OpenIdConnectParameterNames.IdToken,
                    Value = tokenResponse.IdentityToken
                },

                new AuthenticationToken
                {
                    Name = OpenIdConnectParameterNames.AccessToken,
                    Value = tokenResponse.AccessToken
                },

                new AuthenticationToken
                {
                    Name = OpenIdConnectParameterNames.RefreshToken,
                    Value = tokenResponse.RefreshToken
                }
            };

            DateTime expiresAt = DateTime.UtcNow + TimeSpan.FromSeconds(tokenResponse.ExpiresIn);

            updatedTokens.Add(new AuthenticationToken
            {
                Name = "expires_at",
                Value = expiresAt.ToString("o", CultureInfo.InvariantCulture)
            });



            /// get authenticate result containing the current principal and properties
            AuthenticateResult authenticationResult = await httpContext.AuthenticateAsync("cookies");

            authenticationResult.Properties.StoreTokens(updatedTokens);

            await httpContext.SignInAsync("cookies", authenticationResult.Principal, authenticationResult.Properties);



            /// return the new access token 
            return tokenResponse.AccessToken;
        }

        return string.Empty;
    }

Как только я нажимаю RequestRefreshTokenAsync, следующее:результат.

System.ArgumentException: параметр обязателен (параметр refresh_token ') в словаре IdentityModel.Internal.DictionaryExtensions.AddRequired (IDictionary`2, ключ String, значение String, логическое allowEmpty) в IdentityModel.Client.HttpClientTokenRequestExtensions.RequestRefreshTokenAsync (клиент HttpMessageInvoker, запрос RefreshTokenRequest, CancellationToken cancellationToken)

Я пытался добавить в объект RefreshTokenRequest * 101 *

удача *1014* * 1012не удается указать, что «grant_type» является дублирующим ключом.

Мое последнее обновление

   TokenResponse tokenResponse = await _httpClient.RequestRefreshTokenAsync(new RefreshTokenRequest
    {
        Address = discoveryResponse.TokenEndpoint,
        ClientSecret = Credentials.CLIENT_SECRET,
        ClientId = Credentials.CLIENT_ID,
        RefreshToken = "refreshed"
    });

, но tokenResponse недействителен

{"error": "invalid_grant"}

и настройка

     GrantType = "refresh_token"

все еще не повезло.

Чего мне не хватает?

https://readthedocs.org/projects/identitymodel/downloads/pdf/latest/

1 Ответ

0 голосов
/ 23 декабря 2019

Токены обновления поддерживаются для следующих потоков: код авторизации, гибридный поток и поток учетных данных владельца пароля.

http://docs.identityserver.io/en/latest/topics/refresh_tokens.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...