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 WIDESEA_Core.Const; using WIDESEA_Core.DB; using WIDESEA_Core.Helper; using WIDESEA_Core.Seed; namespace WIDESEA_Core.HttpContextUser { public class AspNetUser : IUser { private readonly IHttpContextAccessor _accessor; //private readonly ILogger _logger; public AspNetUser(IHttpContextAccessor accessor/*, ILogger logger*/) { _accessor = accessor; /*_logger = logger;*/ } public string UserName => UserInfo.UserName; //private string GetName() //{ // if (IsAuthenticated() && _accessor.HttpContext.User.Identity.Name.IsNotEmptyOrNull()) // { // return _accessor.HttpContext.User.Identity.Name; // } // else // { // if (!string.IsNullOrEmpty(GetToken())) // { // var getNameType = /*Permissions.IsUseIds4 ? */"name" /*: "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"*/; // return GetUserInfoFromToken(getNameType).FirstOrDefault().ObjToString(); // } // } // return ""; //} public int UserId => GetClaimValueByType("jti").FirstOrDefault().ObjToInt(); public long TenantId => UserInfo.TenantId; public int RoleId => UserInfo.RoleId; public string Token => "throw new NotImplementedException()"; public int SystemType => UserInfo.SystemType; public bool IsAuthenticated() { return _accessor.HttpContext.User.Identity.IsAuthenticated; } public string GetToken() { return _accessor.HttpContext?.Request?.Headers["Authorization"].ObjToString().Replace("Bearer ", ""); } private UserInfo _userInfo { get; set; } private UserInfo UserInfo { get { if (_userInfo != null) return _userInfo; SqlSugarClient sqlSugarClient = new SqlSugarClient(new ConnectionConfig { ConfigId = MainDb.CurrentDbConnId, DbType = MainDb.DbType, //ConnectionString = AppSettings.app(MainDb.ConnectionString).DecryptDES(AppSecret.DB), ConnectionString = AppSettings.app(MainDb.ConnectionString), IsAutoCloseConnection = true }); dynamic userInfo = sqlSugarClient.Queryable(MainDb.UserTableName, "x").Where(MainDb.UserId, "=", UserId).Select(GetUserInfoSelectModels()).First(); if (userInfo != null) { _userInfo = new UserInfo() { RoleId = userInfo.Role_Id, TenantId = userInfo.TenantId, SystemType = userInfo.SystemType, UserName = userInfo.UserName, }; return _userInfo; } return new UserInfo(); } } public bool IsSuperAdmin => IsRoleIdSuperAdmin(RoleId); public List Permissions => throw new NotImplementedException(); public UserInfo GetCurrentUserInfo() { return UserInfo; } public List GetUserInfoSelectModels() { List selectModels = new List() { new() { FieldName = MainDb.TenantId }, new() { FieldName = MainDb.RoleId, }, new() { FieldName = MainDb.SystemType }, new() { FieldName = MainDb.UserName } }; return selectModels; } 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 MessageModel MessageModel { get; set; } 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 int SystemType { get; set; } public string UserName { get; set; } public int UserId { get; set; } public string UserTrueName { get; set; } public string HeadImageUrl { get; set; } } }