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