/// <summary>
        /// 获取或创建在线用户信息
        /// </summary>
        /// <param name="userName">用户名</param>
        /// <returns>在线用户信息</returns>
        public virtual async Task <OnlineUser> GetOrCreate(string userName)
        {
            string key = $"Identity_OnlineUser_{userName}";
            DistributedCacheEntryOptions options = new DistributedCacheEntryOptions();

            options.SetSlidingExpiration(TimeSpan.FromMinutes(30));
            using (await _asyncLock.LockAsync())
            {
                return(await _cache.GetAsync <OnlineUser>(key,
                                                          async() =>
                {
                    UserManager <TUser> userManager = _serviceProvider.GetService <UserManager <TUser> >();
                    TUser user = await userManager.FindByNameAsync(userName);
                    if (user == null)
                    {
                        return null;
                    }

                    IList <string> roles = await userManager.GetRolesAsync(user);
                    RoleManager <TRole> roleManager = _serviceProvider.GetService <RoleManager <TRole> >();
                    bool isAdmin = roleManager.Roles.ToList().Any(m => roles.Contains(m.Name) && m.IsAdmin);
                    RefreshToken[] refreshTokens = await GetRefreshTokens(user);
                    OnlineUser onlineUser = new OnlineUser()
                    {
                        Id = user.Id.ToString(),
                        UserName = user.UserName,
                        NickName = user.NickName,
                        Email = user.Email,
                        HeadImg = user.HeadImg,
                        IsAdmin = isAdmin,
                        Roles = roles.ToArray(),
                        RefreshTokens = refreshTokens.ToDictionary(m => m.ClientId, m => m)
                    };

                    // UserClaim都添加到扩展数据
                    IList <Claim> claims = await userManager.GetClaimsAsync(user);
                    foreach (Claim claim in claims)
                    {
                        onlineUser.ExtendData.Add(claim.Type, claim.Value);
                    }

                    return onlineUser;
                },
                                                          options));
            }
        }
        /// <summary>
        /// 获取在<see cref="OnlineUser"/>线用户信息
        /// </summary>
        public static async Task <OnlineUser> GetOnlineUser(this IServiceProvider provider)
        {
            ClaimsPrincipal principal = provider.GetService <IPrincipal>() as ClaimsPrincipal;

            if (principal == null || !principal.Identity.IsAuthenticated)
            {
                return(null);
            }

            string userName = principal.Identity.Name;
            IOnlineUserProvider onlineUserProvider = provider.GetService <IOnlineUserProvider>();

            if (onlineUserProvider == null)
            {
                return(null);
            }

            OnlineUser onlineUser = await onlineUserProvider.GetOrCreate(userName);

            return(onlineUser);
        }