IdentityServer4 刷新令牌问题

IdentityServer4 refresh token issue

有谁知道我如何申请 refresh_token?我在请求 access_token 时试图得到 refresh_token。目前我得到这个输出。

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

因此 refresh_token 为空。现在我知道您不能使用授予类型的客户端凭据来拥有刷新令牌。因此,我创建了另外两个客户端,一个是密码授权类型,另一个是混合授权类型。我还将两者的范围设置为离线访问。请求令牌时,我得到 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();
}

谁能指出我哪里错了?

我遇到了同样的问题 - 我为资源所有者密码凭据流程配置了我的客户端 (AllowGrantTypes = GrantTypes.ResourceOwnerPassword) 并且我为客户端启用了刷新令牌生成 (AllowOfflineAccess = true)。即便如此,在每次访问令牌请求时,refresh_token 字段都会返回一个 null 值。

事实证明,调用客户端应用程序还需要添加一个额外的范围来明确告诉 IdentityServer4 它期望发送刷新令牌。除了您在请求访问令牌时指定的任何范围之外,还包括 space 分隔列表中的 offline_access。一旦我添加了这个额外的范围,刷新令牌就开始出现了。

在您的具体示例中,可能的编辑可能是:

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

您可以使用 this link 在 IdentityServer4 文档中阅读有关此要求的信息。相关信息在最后一段&特别是这句话:

To request a refresh token, the client needs to include the offline_access scope in the token request (and must be authorized to request for that scope).