36 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			36 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Collections.Concurrent;
 | 
						|
using Microsoft.AspNetCore.Authentication.JwtBearer;
 | 
						|
 | 
						|
namespace LDX.WebApi.Providers
 | 
						|
{
 | 
						|
    public class OpenRefreshTokenProvider : AuthenticatorTokenProvider
 | 
						|
    {
 | 
						|
        private static ConcurrentDictionary<string, string> _refreshTokens = new ConcurrentDictionary<string, string>();
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 生成 refresh_token
 | 
						|
        /// </summary>
 | 
						|
        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();
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 由 refresh_token 解析成 access_token
 | 
						|
        /// </summary>
 | 
						|
        public override void Receive(AuthenticationTokenReceiveContext context)
 | 
						|
        {
 | 
						|
            string value;
 | 
						|
            if (_refreshTokens.TryRemove(context.Token, out value))
 | 
						|
            {
 | 
						|
                context.DeserializeTicket(value);
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
} |