using Microsoft.AspNetCore.Http; namespace IRaCIS.Core.Domain.Share { /// /// 用户信息 /// public class UserInfo : IUserInfo { private readonly IHttpContextAccessor _accessor; public UserInfo(IHttpContextAccessor accessor) { _accessor = accessor; } /// /// 用户角色Id /// public Guid UserRoleId { get { var id = _accessor?.HttpContext?.User?.FindFirst(JwtIRaCISClaimType.UserRoleId); if (id != null && !string.IsNullOrEmpty(id.Value)) { return Guid.Parse(id.Value); } return Guid.Empty; } } /// /// 真实用户Id /// public Guid IdentityUserId { get { var id = _accessor?.HttpContext?.User?.FindFirst(JwtIRaCISClaimType.IdentityUserId); if (id != null && !string.IsNullOrEmpty(id.Value)) { return Guid.Parse(id.Value); } return Guid.Empty; } } public Guid UserTypeId { get { var userTypeId = _accessor?.HttpContext?.User?.FindFirst(JwtIRaCISClaimType.UserTypeId); if (userTypeId != null && !string.IsNullOrEmpty(userTypeId.Value)) { return Guid.Parse(userTypeId.Value); } return Guid.Empty; } } /// /// 用户名 /// public string UserName { get { var name = _accessor?.HttpContext?.User?.FindFirst(JwtIRaCISClaimType.UserName); if (name != null && !string.IsNullOrEmpty(name.Value)) { return name.Value; } return ""; } } public string FullName { get { var name = _accessor?.HttpContext?.User?.FindFirst(JwtIRaCISClaimType.FullName); if (name != null && !string.IsNullOrEmpty(name.Value)) { return name.Value; } return ""; } } public string UserTypeShortName { get { var userType = _accessor?.HttpContext?.User?.FindFirst(JwtIRaCISClaimType.UserTypeShortName); if (userType != null && !string.IsNullOrEmpty(userType.Value)) { return userType.Value; } return string.Empty; } } public string UserTypeEnumStr { get { var userType = _accessor?.HttpContext?.User?.FindFirst(JwtIRaCISClaimType.UserTypeEnum); if (userType != null && !string.IsNullOrEmpty(userType.Value)) { return userType.Value; } return UserTypeEnum.ShareImage.ToString(); } } public int UserTypeEnumInt { get { var userType = _accessor?.HttpContext?.User?.FindFirst(JwtIRaCISClaimType.UserTypeEnumInt); if (userType != null && !string.IsNullOrEmpty(userType.Value)) { return int.Parse(userType.Value); } return 0; } } public bool IsAdmin { get { var userType = _accessor?.HttpContext?.User?.FindFirst(JwtIRaCISClaimType.UserTypeEnumInt); if (userType != null && !string.IsNullOrEmpty(userType.Value)) { return int.Parse(userType.Value) == (int)UserTypeEnum.SuperAdmin; } return false; } } public bool IsZhiZhun { get { var isZhizhunClaime = _accessor?.HttpContext?.User?.FindFirst(JwtIRaCISClaimType.IsZhiZhun); if (isZhizhunClaime != null && !string.IsNullOrEmpty(isZhizhunClaime.Value)) { return bool.Parse(isZhizhunClaime.Value); } return false; } } public bool IsTestUser { get { var isTestUserClaime = _accessor?.HttpContext?.User?.FindFirst(JwtIRaCISClaimType.IsTestUser); if (isTestUserClaime != null && !string.IsNullOrEmpty(isTestUserClaime.Value)) { return bool.Parse(isTestUserClaime.Value); } return false; } } public string UserToken { get { var authorizationHeader = _accessor?.HttpContext?.Request.Headers["Authorization"].ToString(); if (!string.IsNullOrWhiteSpace(authorizationHeader)) { return authorizationHeader.Substring(7); } var token = _accessor?.HttpContext?.Request.Query["access_token"].ToString(); if (!string.IsNullOrWhiteSpace(token)) { return token; } return string.Empty; } } public string PermissionStr { get { var permissionStr = _accessor?.HttpContext?.User?.FindFirst(JwtIRaCISClaimType.PermissionStr); if (permissionStr != null && !string.IsNullOrEmpty(permissionStr.Value)) { return permissionStr.Value; } return string.Empty; } } public string IP { get { return _accessor?.HttpContext.GetClientIP(); } } public string LocalIp { get { return _accessor?.HttpContext?.Connection.LocalIpAddress.MapToIPv4().ToString(); } } public bool IsEn_Us { get { var lan = _accessor?.HttpContext?.Request?.Headers["Accept-Language"]; if (lan is not null && !string.IsNullOrEmpty(lan.Value)) { return lan.Value == "en-US,en;q=0.5".ToString(); } return true; } } public string RequestUrl { get { var url = _accessor?.HttpContext?.Request?.Path.ToString(); var list = url.Split('/').Where(t => !string.IsNullOrWhiteSpace(t)).ToList(); if (url.Contains("Inspection", StringComparison.OrdinalIgnoreCase)) { list.RemoveAt(0); return string.Join('/', list.Take(2)); } else { return string.Join('/', list.Take(2)); } } } public string TimeZoneId { get { var timeZoneId = _accessor?.HttpContext?.Request?.Headers["TimeZoneId"]; if (timeZoneId is not null && !string.IsNullOrEmpty(timeZoneId.Value)) { return timeZoneId.Value; } //return "Etc/UTC"; return "Asia/Shanghai"; } } public Guid? SignId { get; set; } public Guid? BatchId { get; set; } /// /// 是否不需要记录稽查 /// public bool IsNotNeedInspection { get; set; } = false; } public static class ClaimAttributes { /// /// 用户Id /// public const string UserId = "id"; public const string UserTypeId = "userTypeId"; /// /// 用户名 /// public const string UserName = "name"; /// /// 姓名 /// public const string RealName = "realName"; public const string ReviewerCode = "reviewerCode"; public const string UserType = "userTypeShortName"; } public struct JwtIRaCISClaimType { public const string IdentityUserId = "identityUserId"; public const string UserRoleId = "userRoleId"; public const string Code = "code"; public const string UserName = "name"; public const string FullName = "fullName"; public const string UserTypeId = "userTypeId"; public const string UserTypeEnum = "userTypeEnum"; public const string UserTypeEnumName = "userTypeEnumName"; public const string UserTypeEnumInt = "userTypeEnumInt"; public const string UserTypeShortName = "userTypeShortName"; public const string IsTestUser = "isTestUser"; public const string IsZhiZhun = "isZhiZhun"; public const string PermissionStr = "permissionStr"; } public static class HttpContextExtension { public static string GetClientIP(this HttpContext context) { //scp 服务创建的记录不能获取请求上下文 if (context != null) { var ip = context.Request.Headers["Cdn-Src-Ip"].FirstOrDefault(); if (!string.IsNullOrEmpty(ip)) return IpReplace(ip); ip = context.Request.Headers["X-Forwarded-For"].FirstOrDefault(); if (!string.IsNullOrEmpty(ip)) return IpReplace(ip); ip = context.Connection.RemoteIpAddress.ToString(); return IpReplace(ip); } else { return string.Empty; } } static string IpReplace(string inip) { //::ffff: //::ffff:192.168.2.131 这种IP处理 if (inip.Contains("::ffff:")) { inip = inip.Replace("::ffff:", ""); } return inip; } } }