DefaultProfileService.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using IdentityModel;
  2. using IdentityServer4.Extensions;
  3. using IdentityServer4.Models;
  4. using IdentityServer4.Services;
  5. using Long.Common.Basedata;
  6. using Long.Common.Enums;
  7. using Long.DAO.Basedata;
  8. using System.Security.Claims;
  9. namespace Auth
  10. {
  11. public class DefaultProfileService : IProfileService
  12. {
  13. private readonly ISystemUserDatabase _systemUserDatabase = new SystemUserDatabase();
  14. private readonly IUserDatabase _userDatabase = new UserDatabase();
  15. /// <summary>
  16. /// 只要有关用户的身份信息单元被请求(例如在令牌创建期间或通过用户信息终点),就会调用此方法
  17. /// </summary>
  18. /// <param name="context"></param>
  19. /// <returns></returns>
  20. public virtual async Task GetProfileDataAsync(ProfileDataRequestContext context)
  21. {
  22. var subject = context.Subject;
  23. if (subject == null)
  24. {
  25. throw new ArgumentNullException(nameof(context.Subject));
  26. }
  27. var subjectId = subject.GetSubjectId();
  28. if (context.Client.ClientId == UserTypeEnum.Admin.ToString().ToLower())
  29. {
  30. // 系统用户登录
  31. var systemUser = await _systemUserDatabase.GetFirstAsync(long.Parse(subjectId));
  32. if (systemUser == null)
  33. {
  34. throw new ArgumentException("Invalid subject identifier");
  35. }
  36. var claims = GetClaimsFromUser(systemUser);
  37. context.IssuedClaims.AddRange(claims);
  38. }
  39. else if (context.Client.ClientId == UserTypeEnum.User.ToString().ToLower())
  40. {
  41. // 系统用户登录
  42. var user = await _userDatabase.GetFirstAsync(long.Parse(subjectId));
  43. if (user == null)
  44. {
  45. throw new ArgumentException("Invalid subject identifier");
  46. }
  47. var claims = GetClaimsFromUser(user);
  48. context.IssuedClaims.AddRange(claims);
  49. }
  50. }
  51. /// <summary>
  52. /// 验证用户是否有效 例如:token创建或者验证
  53. /// </summary>
  54. /// <param name="context"></param>
  55. /// <returns></returns>
  56. public virtual async Task IsActiveAsync(IsActiveContext context)
  57. {
  58. if (context.Client.ClientId == UserTypeEnum.Admin.ToString().ToLower())
  59. {
  60. var user = await _systemUserDatabase.GetFirstAsync(long.Parse(context.Subject.GetSubjectId()));
  61. context.IsActive = user?.Opened == true;
  62. }
  63. else if (context.Client.ClientId == UserTypeEnum.User.ToString().ToLower())
  64. {
  65. var user = await _userDatabase.GetFirstAsync(long.Parse(context.Subject.GetSubjectId()));
  66. context.IsActive = user?.Opened == true;
  67. }
  68. }
  69. /// <summary>
  70. /// 获取声明列表
  71. /// </summary>
  72. /// <param name="user"></param>
  73. /// <returns></returns>
  74. private IEnumerable<Claim> GetClaimsFromUser(SystemUser user)
  75. {
  76. var claims = new List<Claim>
  77. {
  78. new Claim(JwtClaimTypes.Id, user.Id.ToString()),
  79. new Claim("UserName", user.UserName)
  80. };
  81. return claims;
  82. }
  83. /// <summary>
  84. /// 获取声明列表
  85. /// </summary>
  86. /// <param name="user"></param>
  87. /// <returns></returns>
  88. private IEnumerable<Claim> GetClaimsFromUser(User user)
  89. {
  90. var claims = new List<Claim>
  91. {
  92. new Claim(JwtClaimTypes.Id, user.Id.ToString()),
  93. new Claim("UserName", user.UserName)
  94. };
  95. return claims;
  96. }
  97. }
  98. }