IdentityServer4 refre sh проблема с токеном - PullRequest
0 голосов
/ 25 мая 2020

Кто-нибудь знает, как я могу запросить refresh_token? Я пытаюсь получить refresh_token при запросе access_token. На данный момент я получаю этот вывод.

{
“access_token”: “eyJhbGciOiJSU…Zp1eS1WLY2KW2cLvEHhfDfikAYhPEDbAHTvtQu_yBgRsRxhTTPA”,
“refresh_token”: null,
“expires_in”: “3600”,
“token_type”: “Bearer”,
“scope”: “app.api.whatever.full”
}

Следовательно, refresh_token имеет значение null. Теперь я знаю, что у вас не может быть токена refre sh с типом предоставления учетных данных клиента. Поэтому я создал еще двух клиентов, один с типом предоставления пароля, а другой - с гибридным типом предоставления. Я также установил для обеих сторон автономный доступ. При запросе токена я получаю invalid_client. Я застрял и не знаю, как решить эту проблему. Вот как я запрашиваю токен:

public async Task GetUserToken(string client_id, string client_secret, string username, string password, string scope)
{
var client = new HttpClient();

var dict = new Dictionary();
dict.Add(“client_id”, client_id);
dict.Add(“client_secret”, client_secret);
dict.Add(“grant_type”, “password”);
dict.Add(“scope”, scope);
dict.Add(“username”, username);
dict.Add(“password”, password);

client.BaseAddress = new Uri($”{Request.Scheme}://{Request.Host.Value}”);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(“application/json”));

var req = new HttpRequestMessage(HttpMethod.Post, “/connect/token”) { Content = new FormUrlEncodedContent(dict) };
var res = await client.SendAsync(req).ConfigureAwait(false);

if (res.IsSuccessStatusCode)
{
return Ok(res.Content.ReadAsStringAsync().Result);
}
return BadRequest();
}

Может ли кто-нибудь указать, где я здесь ошибаюсь?

1 Ответ

0 голосов
/ 29 мая 2020

У меня была такая же проблема - мой клиент был настроен для потока учетных данных пароля владельца ресурса (AllowGrantTypes = GrantTypes.ResourceOwnerPassword), и я включил генерацию токена refre sh для клиента (AllowOfflineAccess = true). Тем не менее, при каждом запросе токена доступа поле refresh_token возвращалось со значением null.

Оказывается, вызывающему клиентскому приложению также необходимо добавить дополнительную область, чтобы явно сообщить IdentityServer4, что оно ожидает будет отправлен токен refre sh. В дополнение к любым областям, которые вы указываете при запросе токена доступа, также включите offline_access в список, разделенный пробелами. Как только я добавил эту дополнительную область, токен refre sh начал поступать.

В вашем конкретном примере c потенциальное редактирование может быть:

dict.Add(“scope”, $"{scope} offline_access");

Вы можете использовать эта ссылка, чтобы прочитать об этом требовании в документации IdentityServer4. Соответствующая информация находится в последнем абзаце и, в частности, в этом предложении:

Чтобы запросить токен refre sh, клиент должен включить область offline_access в запрос токена (и должен иметь право запрашивать этот объем).

...