【问题标题】:Refresh token for IdentityServer4刷新 IdentityServer4 的令牌
【发布时间】:2019-03-23 16:39:25
【问题描述】:

我们正在实施 IdentityServer4 并试图找出为什么我们没有获得刷新令牌。使用创建的示例,我试图确保至少在本地计算机上获得刷新令牌。到目前为止还没有运气。

客户端配置如下:

new Client
{
    ClientId = "client",
    AllowedGrantTypes = GrantTypes.ClientCredentials,
    ClientSecrets = { new Secret("secret".Sha256()) },
    AllowedScopes = { "api1" },
    AllowOfflineAccess = true,
    AccessTokenLifetime = 60,
    IdentityTokenLifetime = 60
},

使用客户端的测试程序如下所示:

/* CLIENT AUTHENTICATION WITH A KNOWN SECRET */
var tokenClient = new TokenClient(disco.TokenEndpoint, "client", "secret");
var tokenResponse = await tokenClient.RequestClientCredentialsAsync("api1");

if (tokenResponse.IsError)
{
    Console.WriteLine("TOKEN ERROR:\r\n" + tokenResponse.Error);
    return;
}

Console.WriteLine(tokenResponse.Json);

using (var client = new HttpClient())
{
    client.SetBearerToken(tokenResponse.AccessToken);

    var numberOfSeconds = 10;

    while( numberOfSeconds < 600 ) 
    {
        Console.WriteLine($"slept for for {numberOfSeconds}");
        Thread.Sleep(10 * 1000);
    
        var response = await client.GetAsync("http://localhost:52801/api/identity");
        if (!response.IsSuccessStatusCode)
        {
            Console.WriteLine("API ERROR:\r\n" + response.StatusCode);
            break;
        }
        else
        {
            var content = await response.Content.ReadAsStringAsync();
            Console.WriteLine("API RESPONSE:\r\n" + JArray.Parse(content));
        }

        numberOfSeconds += 10;
    }
}

打印出来的token是这样的:

{
  "access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjRkMTJiNjI2MmNmODA0ODBmOTU1YTJhNmEyMDE1MzJlIiwidHlwIjoiSldUIn0.eyJuYmYiO
jE1Mzk4MjQyOTcsImV4cCI6MTUzOTgyNDM1NywiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIiwiYXVkIjpbImh0dHA6Ly9sb2NhbGhvc3Q6NTAwMC9yZ
XNvdXJjZXMiLCJhcGkxIl0sImNsaWVudF9pZCI6ImNsaWVudCIsInNjb3BlIjpbImFwaTEiXX0.SjBbzIgNfhZ7K_BfrP6tRR71_VDRyxbUWdm0_7TEO8Tof
_BnXpxMipjeNylVenzEl8rzC5UlkajQpGmKsmPiBKB16QOgkYJjIMitOrjJ0xG-HzgbfW9umxh-mvYMk8aJj2uFYCX6DEs9XsH0Y9U5R4Qxx3zCwkq8SMtwM
4uN3mEJPu_zu7CUp0R7bAmsyjwxvx_s1BkjdGRdwOJ1JaobYqFx800oI5Q19wpWfCoYRAm9fQVBLAh7oJK07iNg037KSam9sAHiLCMh-JsRSHE3alLSEHNAQ
bMWTVJDD5s5ssjDS6XZFuVkGGL1Ezb8wpJkgdA2z_g6h9zHK9pTt3exmw",
  "expires_in": 60,
  "token_type": "Bearer"
}

使用访问令牌 360 秒后过期,并且没有刷新令牌去获取另一个访问令牌。我有什么明显的遗漏吗?

【问题讨论】:

    标签: identityserver4


    【解决方案1】:

    您正在使用 Client Credentials 授权类型,因此您不需要 Refresh Token 来请求另一个 Access Token 作为您的客户端(应用程序) 是受信任的。

    刷新令牌仅在需要用户交互的授权类型中才需要,用于避免必须返回用户获取其凭据。

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

    以下流程支持刷新令牌:授权 代码、混合和资源所有者密码凭证流。客户 需要通过设置明确授权来请求刷新令牌 AllowOfflineAccess 为 true。

    【讨论】:

    • 谢谢!这是我的问题,当我将代码更改为具有用户名和密码时,我仍然没有获得刷新令牌:
    • var tokenClient = new TokenClient(disco.TokenEndpoint, "ro.client", "secret"); var tokenResponse = await tokenClient.RequestResourceOwnerPasswordAsync("alice", "password", "api1");
    • 尝试添加offline_access 范围,例如:var tokenClient = new TokenClient(disco.TokenEndpoint, "ro.client", "secret"); var tokenResponse = await tokenClient.RequestResourceOwnerPasswordAsync("alice", "password", "api1 offline_access");
    猜你喜欢
    • 2018-07-07
    • 2020-09-12
    • 2017-03-30
    • 2019-12-23
    • 2018-08-09
    • 2020-02-23
    • 2017-12-25
    • 1970-01-01
    • 2020-02-20
    相关资源
    最近更新 更多