using ATS.NonCustodial.Shared.Common.Enums; using ATS.NonCustodial.Shared.Extensions; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Http; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; namespace ATS.NonCustodial.Shared.Common.Auth { /// /// 用户信息 /// /// Author:mxg /// CreatedTimed:2022-05-15 10:08 PM public class User : IUser { #region Identity private readonly IHttpContextAccessor _accessor; public User(IHttpContextAccessor accessor) { _accessor = accessor; } #endregion Identity /// /// 用户Id /// public virtual long Id { get { var id = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.userId); if (id != null && id.Value.NotNull()) { return id.Value.ToLong().Value; } return 0; } } /// /// 用户名 /// public string Name { get { var name = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.userName); if (name != null && name.Value.NotNull()) { return name.Value; } return ""; } } /// /// 单位id /// public long UnitId { get { var userUnitId = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.userUnitId); if (userUnitId != null && userUnitId.Value.NotNull()) { return (long)userUnitId.Value.ToLong(); } return 0; } } /// /// 部门id /// public long DeptcodeId { get { var userDeptcodeId = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.userDeptcodeId); if (userDeptcodeId != null && userDeptcodeId.Value.NotNull()) { return (long)userDeptcodeId.Value.ToLong(); } return 0; } } /// /// 头像 /// public string Avatar { get { var avatar = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.avatar); return avatar != null && avatar.Value.NotNull() ? avatar.Value : ""; } } /// /// 手机号 /// public string Phone { get { var phone = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.phone); return phone != null && phone.Value.NotNull() ? phone.Value : ""; } } /// /// 当前用户的只为类型转换为枚举 /// public ChatPersonTypeEnum ChatPersonType { get { var personType = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.personType); //return personType != null && personType.Value.NotNull() ? ChatPersonTypeEnum.TryParse(ChatPersonTypeEnum.Admin); var chatPersonType = ChatPersonTypeEnum.Admin; if (personType != null && personType.Value.NotNull() && Enum.TryParse(personType.Value, out chatPersonType)) { } return chatPersonType; } } /// /// 昵称 /// public string NickName { get { var name = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.userNickName); if (name != null && name.Value.NotNull()) { return name.Value; } return ""; } } /// /// 租户Id /// public virtual long? TenantId { get { var tenantId = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.tenantId); if (tenantId != null && tenantId.Value.NotNull()) { return tenantId.Value.ToLong(); } return null; } } /// /// 角色列表 /// public List RoleList { get { var roles = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.roles); if (roles != null && roles.Value.NotNull()) { return roles.Value.ToList().Select(w => w.ToLong()).ToList(); } return new List(); } } /// /// 组织机构 /// public List OrgList { get { var orgs = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.orgs); if (orgs != null && orgs.Value.NotNull()) { return orgs.Value.ToList().Select(w => w.ToLong()).ToList(); } return new List(); } } /// /// 租户类型 /// public virtual TenantTypeEnum? TenantType { get { var tenantType = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.tenantType); if (tenantType != null && tenantType.Value.NotNull()) { return (TenantTypeEnum)Enum.Parse(typeof(TenantTypeEnum), tenantType.Value, true); } return null; } } /// /// 数据隔离 /// public virtual DataIsolationTypeEnum? DataIsolationType { get { var dataIsolationType = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.dataIsolationType); if (dataIsolationType != null && dataIsolationType.Value.NotNull()) { return (DataIsolationTypeEnum)Enum.Parse(typeof(DataIsolationTypeEnum), dataIsolationType.Value, true); } return null; } } /// /// 请求Ip地址 /// public string? RemoteIpAddress => _accessor?.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString(); /// /// /// /// public bool IsAuthenticated() => _accessor.HttpContext.User.Identity!.IsAuthenticated; /// /// /// /// public string? GetToken() { var token = string.Empty; if (GetTokenByKeyword("access_token").NotNull()) { token = GetTokenByKeyword("access_token"); } else if (GetTokenByKeyword("token").NotNull()) { token = GetTokenByKeyword("token"); } else if (GetTokenByKeyword("Authorization").NotNull()) { token = GetTokenByKeyword("Authorization")?.Trim().Replace("Bearer ", "")!; } return token; } /// /// /// /// public IEnumerable GetClaimsIdentity() { var claims = _accessor.HttpContext.User.Claims.ToList(); var headers = _accessor.HttpContext.Request.Headers; claims.AddRange(headers.Select(header => new Claim(header.Key, header.Value))); return claims; } /// /// /// /// /// public List GetClaimValueByType(string claimType) { return (from item in GetClaimsIdentity() where item.Type == claimType select item.Value).ToList(); } /// /// /// /// /// public List GetUserInfoFromToken(string claimType) { var jwtHandler = new JwtSecurityTokenHandler(); var token = ""; token = GetToken(); // token校验 if (!token.IsNotNullOrEmpty() || !jwtHandler.CanReadToken(token)) return new List() { }; var jwtToken = jwtHandler.ReadJwtToken(token); return (from item in jwtToken.Claims where item.Type == claimType select item.Value).ToList(); } /// /// 注销 /// /// /// public async Task LoginOutAsync() => await _accessor.HttpContext.SignOutAsync(); #region private /// /// 获取token /// /// /// private string? GetTokenByKeyword(string tokenKey) => _accessor.HttpContext?.Request.Query[tokenKey].ToString(); #endregion private } }