我有一个 ASP.NET Core Web 和 Web API 应用程序。用户登录后,API 将提供访问和刷新令牌,然后 UI 应用程序将使用
response.cookie.append("refresh token", refresh token)
保存数据,刷新有效期为 30 分钟,访问令牌有效期为 10 分钟。
问题是,当用户闲置 10 分钟或更长时间时,访问令牌将变为空,并且当他尝试发出请求或重定向到另一个页面或 ui 中的某些操作时,它将命中我的基本控制器,然后再进行
HttpClient
调用我的 Web API,我正在检查我的令牌有效性,因此我们当时没有访问令牌;我正在使用刷新令牌调用我的 API,并获取新的访问和刷新令牌并以 HttpContext.Response.Cookie.Append
方式保存。
但我们仍然有现有的请求,当我尝试从保存的 cookie 获取新的访问和刷新令牌以使客户端调用从 api 获取记录时,该请求仍然处于待处理状态,我的访问令牌仍然为空,并且旧的刷新令牌值也是如此,因为当前请求不会使用新附加的令牌进行更新。
我不能使用session,也不能使用js,我需要使用C#来解决它
提前致谢
您可以尝试以下方法,该方法将使用自定义 HTTP 客户端服务。它将检查当前的访问令牌是否已过期,如果过期,它将刷新令牌并在进行 API 调用之前获取新的访问令牌。注入 将
ApiHttpClient
注入控制器或服务以进行经过身份验证的 API 调用。
public class ApiHttpClient
{
private readonly HttpClient _client;
private readonly IHttpContextAccessor _httpContextAccessor;
public ApiHttpClient(HttpClient client, IHttpContextAccessor httpContextAccessor)
{
_client = client;
_httpContextAccessor = httpContextAccessor;
}
private async Task<string> GetAccessTokenAsync()
{
var accessToken = _httpContextAccessor.HttpContext.Request.Cookies["access_token"];
if (IsAccessTokenExpired(accessToken))
{
var refreshToken = _httpContextAccessor.HttpContext.Request.Cookies["refresh_token"];
accessToken = await RefreshAccessTokenAsync(refreshToken);
}
return accessToken;
}
private bool IsAccessTokenExpired(string accessToken)
{
// Implement your logic here to check if the token is expired
return true;
}
private async Task<string> RefreshAccessTokenAsync(string refreshToken)
{
// Code for refresh token to get a new access token and update the cookies with the new tokens
return "new_access_token";
}
public async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request)
{
var accessToken = await GetAccessTokenAsync();
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
return await _client.SendAsync(request);
}
}
启动.cs:
services.AddHttpContextAccessor();
services.AddHttpClient<ApiHttpClient>();