using System; using System.Collections.Concurrent; using Microsoft.AspNetCore.Authentication.JwtBearer; namespace LDX.WebApi.Providers { public class OpenRefreshTokenProvider : AuthenticatorTokenProvider { private static ConcurrentDictionary _refreshTokens = new ConcurrentDictionary(); /// /// 生成 refresh_token /// public override void Create(AuthenticationTokenCreateContext context) { context.Ticket.Properties.IssuedUtc = DateTime.UtcNow; context.Ticket.Properties.ExpiresUtc = DateTime.UtcNow.AddDays(60); context.SetToken(Guid.NewGuid().ToString("n") + Guid.NewGuid().ToString("n")); _refreshTokens[context.Token] = context.SerializeTicket(); } /// /// 由 refresh_token 解析成 access_token /// public override void Receive(AuthenticationTokenReceiveContext context) { string value; if (_refreshTokens.TryRemove(context.Token, out value)) { context.DeserializeTicket(value); } } } }