using IdentityModel; using IdentityServer4.Extensions; using IdentityServer4.Models; using IdentityServer4.Services; using Long.Common.Basedata; using Long.Common.Enums; using Long.DAO.Basedata; using System.Security.Claims; namespace Auth { public class DefaultProfileService : IProfileService { private readonly ISystemUserDatabase _systemUserDatabase = new SystemUserDatabase(); private readonly IUserDatabase _userDatabase = new UserDatabase(); /// /// 只要有关用户的身份信息单元被请求(例如在令牌创建期间或通过用户信息终点),就会调用此方法 /// /// /// public virtual async Task GetProfileDataAsync(ProfileDataRequestContext context) { var subject = context.Subject; if (subject == null) { throw new ArgumentNullException(nameof(context.Subject)); } var subjectId = subject.GetSubjectId(); if (context.Client.ClientId == UserTypeEnum.Admin.ToString().ToLower()) { // 系统用户登录 var systemUser = await _systemUserDatabase.GetFirstAsync(long.Parse(subjectId)); if (systemUser == null) { throw new ArgumentException("Invalid subject identifier"); } var claims = GetClaimsFromUser(systemUser); context.IssuedClaims.AddRange(claims); } else if (context.Client.ClientId == UserTypeEnum.User.ToString().ToLower()) { // 系统用户登录 var user = await _userDatabase.GetFirstAsync(long.Parse(subjectId)); if (user == null) { throw new ArgumentException("Invalid subject identifier"); } var claims = GetClaimsFromUser(user); context.IssuedClaims.AddRange(claims); } } /// /// 验证用户是否有效 例如:token创建或者验证 /// /// /// public virtual async Task IsActiveAsync(IsActiveContext context) { if (context.Client.ClientId == UserTypeEnum.Admin.ToString().ToLower()) { var user = await _systemUserDatabase.GetFirstAsync(long.Parse(context.Subject.GetSubjectId())); context.IsActive = user?.Opened == true; } else if (context.Client.ClientId == UserTypeEnum.User.ToString().ToLower()) { var user = await _userDatabase.GetFirstAsync(long.Parse(context.Subject.GetSubjectId())); context.IsActive = user?.Opened == true; } } /// /// 获取声明列表 /// /// /// private IEnumerable GetClaimsFromUser(SystemUser user) { var claims = new List { new Claim(JwtClaimTypes.Id, user.Id.ToString()), new Claim("UserName", user.UserName) }; return claims; } /// /// 获取声明列表 /// /// /// private IEnumerable GetClaimsFromUser(User user) { var claims = new List { new Claim(JwtClaimTypes.Id, user.Id.ToString()), new Claim("UserName", user.UserName) }; return claims; } } }