0

我有以下代码:

public async Task<TokenResponse> RefreshTokenAsync(string refreshToken)
{
    HttpClient client = new();
    var discoveryResponse = await client.GetDiscoveryDocumentAsync("https://localhost:44334");

    var response = await client.RequestRefreshTokenAsync(new RefreshTokenRequest
    {
        Address = discoveryResponse.TokenEndpoint,
        ClientId = "...",
        ClientSecret = "...",
        RefreshToken = refreshToken
    });

    return response;
}

它总是返回带有 invalid_client 消息的 400 Bad Request。当我在 Postman 中刷新令牌时,它运行良好。问题出在哪里?

4

2 回答 2

0

refresh-token 的目的是:用户无需在每次会话到期时使用应用程序中的凭据(用户名/密码)重新进行身份验证。因此,您的应用程序需要连接到端点身份并在令牌或刷新令牌超时之前使用新的刷新令牌。在 asp dotnet core Identity 和 JwtToken 中总是有一个默认的超时值;不管怎样:您需要在此超时到期之前捕获刷新令牌,否则您的身份会理解没有打开浏览器或不在线的用户。这可能意味着开发一个保留在 Roudin-Robin 中的例程,在浏览器打开时始终使用新令牌刷新应用程序。

于 2022-02-27T16:45:53.577 回答
0

我将代码更改为:

public async Task<TokenResponse> RefreshTokenAsync(string refreshToken)
{
    HttpClient client = new();
    var discoveryResponse = await client.GetDiscoveryDocumentAsync("https://localhost:44334");

    var tokenClient = new TokenClient(client, new TokenClientOptions
    {
        Address = discoveryResponse.TokenEndpoint,
        ClientId = "...",
        ClientSecret = "...",
    });

    var response = await tokenClient.RequestRefreshTokenAsync(refreshToken);
    response.HttpResponse.EnsureSuccessStatusCode();

    return response;
}

现在它按预期工作。

于 2022-02-27T20:12:04.767 回答