using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using SqlSugar; using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; using System.Linq; using System.Security.Claims; using System.Text; using System.Threading.Tasks; using WIDESEAWCS_Core.Const; using WIDESEAWCS_Core.DB; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_Core.Seed; using ICacheService = WIDESEAWCS_Core.Caches.ICacheService; namespace WIDESEAWCS_Core.HttpContextUser { public class AspNetUser : IUser { private readonly IHttpContextAccessor _accessor; private readonly ICacheService _cacheService; //private readonly ILogger _logger; public AspNetUser(IHttpContextAccessor accessor, ICacheService cacheService) { _accessor = accessor; _cacheService = cacheService; /*_logger = logger;*/ } public string UserName => GetUserInfoFromToken(ClaimTypes.Name).FirstOrDefault() ?? ""; public int UserId => GetClaimValueByType(JwtRegisteredClaimNames.Jti) == null ? 0 : GetClaimValueByType(JwtRegisteredClaimNames.Jti).FirstOrDefault()?.ObjToInt() ?? 0; public long TenantId => GetUserInfoFromToken(nameof(TenantId)).FirstOrDefault()?.ObjToLong() ?? -1; public int RoleId => GetUserInfoFromToken(ClaimTypes.Role).FirstOrDefault()?.ObjToInt() ?? 0; public string Token => GetToken(); public int MenuType => (_accessor.HttpContext?.Request.Headers.ContainsKey("uniapp") ?? false) ? 1 : 0; public bool IsAuthenticated() { return _accessor.HttpContext?.User?.Identity?.IsAuthenticated ?? false; } public string GetToken() { string token = _cacheService.Get(UserId.ToString()); if (!string.IsNullOrEmpty(token)) { return token; } return string.Empty; //return _accessor.HttpContext?.Request?.Headers["Authorization"].ObjToString().Replace("Bearer ", "") ?? ""; } public void UpdateToke(string token) { _cacheService.AddOrUpdate(UserId.ToString(), token); } public bool IsSuperAdmin => IsRoleIdSuperAdmin(RoleId); public List GetUserInfoFromToken(string ClaimType) { var jwtHandler = new JwtSecurityTokenHandler(); var token = ""; token = GetToken(); // token校验 if (token.IsNotEmptyOrNull() && jwtHandler.CanReadToken(token)) { JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(token); return (from item in jwtToken.Claims where item.Type == ClaimType select item.Value).ToList(); } return new List() { }; } public IEnumerable GetClaimsIdentity() { if (_accessor.HttpContext != null) { var claims = _accessor.HttpContext.User.Claims.ToList(); var headers = _accessor.HttpContext.Request.Headers; foreach (var header in headers) { claims.Add(new Claim(header.Key, header.Value)); } return claims; } return ArraySegment.Empty; } public List GetClaimValueByType(string ClaimType) { return (from item in GetClaimsIdentity() where item.Type == ClaimType select item.Value).ToList(); } public bool IsRoleIdSuperAdmin(int roleId) { return roleId == 1; } } public class UserInfo { public long TenantId { get; set; } public int RoleId { get; set; } public string UserName { get; set; } public int UserId { get; set; } public string UserTrueName { get; set; } public string HeadImageUrl { get; set; } /// /// 使用下面的DeptIds字段 /// [Obsolete] public int DeptId { get; set; } public List DeptIds { get; set; } public string Token { get; set; } public string Token_ID { get; set; } } }