.NET Core Web应用程序访问和刷新Token Cookie在HttpRequest中设置

问题描述 投票:0回答:1

我有一个 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#来解决它

提前致谢

c# asp.net-core-mvc asp.net-core-webapi
1个回答
0
投票

您可以尝试以下方法,该方法将使用自定义 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>();
© www.soinside.com 2019 - 2024. All rights reserved.