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 "";
}
}
///
/// 昵称
///
public string limits
{
get
{
var name = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.limits);
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
}
}