【发布时间】:2019-11-09 07:01:57
【问题描述】:
在下面的代码中,如果访问令牌已过期,我希望更新它。但没有任何效果。我尝试在行返回响应上使用断点进行调试,但该断点不会触发。
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
HttpResponseMessage response = null;
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
response = await base.SendAsync(request, cancellationToken);
if (response.StatusCode != HttpStatusCode.Unauthorized)
return response;
var tokenResponse = _tokenGenerator.GetAccessToken(accessTokenInfo).Result;
if (tokenResponse != null)
{
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", tokenResponse);
response = await base.SendAsync(request, cancellationToken);
}
return response;
}
【问题讨论】:
-
在过期时更新令牌的常用方法是使用过期数据,该数据来自带有令牌响应的令牌端点。您只需在该时间间隔内缓存令牌,每次需要设置承载时检查它是否仍在缓存中。如果没有,请要求一个新的。等等等等。
-
任何示例代码都可以继续前进吗?
-
@RuardvanElburg 我需要使用客户端凭据流来完成。所以我不需要刷新令牌。我将使用客户端 ID 和密码来完成。但是我的实际问题没有解决,这是作为问题提出的
-
@d_f 它的网络托管 api 及其现在的工作。我忘记将端口更改为 localhost。但无论如何,如果我的令牌已过期,我的响应状态为未经授权,所以现在我想知道未经授权错误的实际原因。如何获得?
-
再一次:最好预先检查,而不是事后处理错误。所以只需坚持
_accessTokenValidity = DateTime.UtcNow.AddSeconds(tokenResponse.ExpiresIn);之类的内容,并在每次请求之前检查。当DateTime.UtcNow超过您保留的值时,请求一个新的令牌(并更新_accessTokenValidity)
标签: .net-core identityserver4 access-token sendasync mockhttpmessagehandler