.net core 如何检查访问令牌是否有效?

.net core 如何检查访问令牌是否有效?,.net-core,identityserver4,access-token,sendasync,mockhttpmessagehandler,.net Core,Identityserver4,Access Token,Sendasync,Mockhttpmessagehandler,在下面的代码中,如果访问令牌过期,我将续订它。但什么都不管用。我尝试在返回响应行上使用断点进行调试,但该断点不会触发 protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { HttpResponseMessage response = null;

在下面的代码中,如果访问令牌过期,我将续订它。但什么都不管用。我尝试在返回响应行上使用断点进行调试,但该断点不会触发

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;
        }

在令牌过期时续订令牌的常用方法是使用来自令牌端点的过期数据和令牌响应。您可以缓存该时间间隔的令牌,每次需要设置承载时,您首先尝试从缓存中获取它。当令牌过期时,缓存返回null,因此您请求一个新令牌并再次缓存它。 请参见基于Dominick Baier的示例。如果尚未安装IdentityModel nuget软件包,则需要安装该软件包

公共类TokenClientOptions { 公共字符串地址{get;set;} 公共字符串ClientId{get;set;} 公共字符串ClientSecret{get;set;} } 公共类令牌客户端 { 私有常量字符串AccessTokenCacheKey=访问令牌; 公共HttpClient客户端{get;} 公共令牌ClientOptions{get;} 公共ILogger记录器{get;} 公共IDistributedCache缓存{get;} 公共令牌ClientHttpClient客户端,IOPS选项, IDistributedCache, ILogger记录器 { 客户=客户; 选项=选项.值; 缓存=缓存; 记录器=记录器; } 公共异步任务GetToken { var token=Cache.GetStringAccessTokenCacheKey; 如果令牌!=null 返回令牌; var response=等待客户端。 RequestClientCredentialsTokenAsyncnew ClientCredentialsTokenRequest { 地址=选项。地址, ClientId=Options.ClientId, ClientSecret=Options.ClientSecret }; Cache.SetStringAccessTokenCacheKey,response.AccessToken, 新的DistributedCacheEntryOptions {AbsoluteExpirationRelativeToNow= TimeSpan.FromSecondsresponse.ExpiresIn}; 返回response.AccessToken; } } 公共静态类扩展 { 公共静态void AddTokenClientthis IServiceCollection服务{ services.Configureoptions=> { 选项。地址=https://demo.identityserver.io/connect/token; options.ClientId=客户端; options.ClientSecret=secret; }; services.AddDistributedMemoryCache; services.AddHttpClient; } } 然后在Startup.ConfigureServices中添加:services.AddTokenClient

之后,您可以将TokenClient注入API控制器,并像在上面的示例中一样使用它:

公共类TestController:控制器 { 公共令牌客户端令牌客户端{get;} 公共TestControllerTokenClient=>tokenClient=tokenClient; 公共异步任务索引 { var请求=新的HttpRequestMessage HttpMethod.Get,https://demo.identityserver.io/api/test; var accessToken=await TokenClient.GetToken; request.SetBearerTokenaccessToken; var client=HttpClientFactory.Create; var response=await client.SendAsyncrequest,new CancellationToken; 返回响应; } }
在令牌过期时续订令牌的常用方法是使用来自令牌端点的过期数据和令牌响应。您只需缓存该时间间隔的令牌,每次需要设置承载时,您都会检查它是否仍在缓存中。如果没有,请申请一个新的。诸如此类。任何示例代码都可以继续吗?@RuardvanElburg我需要使用客户端凭据流。所以我不需要刷新令牌。我会用客户id和密码来完成。但我的实际问题并没有解决,我被问到question@d_f它的web托管api和它现在的作品。我忘了将端口更改为localhost。但无论如何,如果我的令牌过期,我会得到未经授权的响应状态,所以现在我想知道未经授权错误的实际原因。如何获得它?再一次:最好是预先检查,而不是事后处理错误。因此,只需坚持像_accessTokenValidity=DateTime.UtcNow.AddSecondstokenResponse.ExpiresIn;每次提出要求前都要检查。当DateTime.UtcNow超过您保留的值时,请求一个新的令牌并更新_accessTokenValidity