using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using DS.Module.Core; using DS.Module.Core.Extensions; using Microsoft.AspNetCore.Http; using Newtonsoft.Json; namespace DS.Module.UserModule; public class AspNetUser : IUser { private readonly IHttpContextAccessor _accessor; public AspNetUser(IHttpContextAccessor accessor) { _accessor = accessor; } public UserInfo UserInfo => GetUserInfo(); public string GetToken() { return _accessor.HttpContext?.Request?.Headers["Authorization"].ToString().Replace("Bearer ", ""); } public string UserId => GetClaimValueByType("jti").FirstOrDefault().ObjToString(); public string GetTenantId() { // return _accessor.HttpContext?.Request?.Headers["Authorization"].ToString().Replace("Bearer ", ""); var tenantId = String.Empty; var token = _accessor.HttpContext?.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last() ?? _accessor.HttpContext?.Request.Headers["X-Token"].FirstOrDefault() ?? _accessor.HttpContext?.Request.Query["Token"].FirstOrDefault() ?? _accessor.HttpContext?.Request.Cookies["Token"]; // token校验 var jwtHandler = new JwtSecurityTokenHandler(); if (!token.IsNullOrEmpty() && jwtHandler.CanReadToken(token)) { JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(token); tenantId = jwtToken.Claims.First(x=>x.Type == "TenantId").Value ; } return tenantId; } public string GetCompanyId() { // return _accessor.HttpContext?.Request?.Headers["Authorization"].ToString().Replace("Bearer ", ""); var companyId = String.Empty; var token = _accessor.HttpContext?.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last() ?? _accessor.HttpContext?.Request.Headers["X-Token"].FirstOrDefault() ?? _accessor.HttpContext?.Request.Query["Token"].FirstOrDefault() ?? _accessor.HttpContext?.Request.Cookies["Token"]; // token校验 var jwtHandler = new JwtSecurityTokenHandler(); if (!token.IsNullOrEmpty() && jwtHandler.CanReadToken(token)) { JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(token); companyId = jwtToken.Claims.First(x=>x.Type == "CompanyId").Value ; } return companyId; } public string GetUserGID() { // return _accessor.HttpContext?.Request?.Headers["Authorization"].ToString().Replace("Bearer ", ""); var GID = String.Empty; var token = _accessor.HttpContext?.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last() ?? _accessor.HttpContext?.Request.Headers["X-Token"].FirstOrDefault() ?? _accessor.HttpContext?.Request.Query["Token"].FirstOrDefault() ?? _accessor.HttpContext?.Request.Cookies["Token"]; // token校验 var jwtHandler = new JwtSecurityTokenHandler(); if (!token.IsNullOrEmpty() && jwtHandler.CanReadToken(token)) { JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(token); GID = jwtToken.Claims.First(x=>x.Type == "GID").Value ; } return GID; } public string TenantId => GetClaimValueByType("TenantId").FirstOrDefault().ObjToString(); public string CompanyId => GetClaimValueByType("CompanyId").FirstOrDefault().ObjToString(); public UserInfo GetUserInfo() { if (_accessor.HttpContext.User.Claims == null) { return null; } var json = _accessor.HttpContext.User.Claims; //获取上传token,可自定义扩展 var token = _accessor.HttpContext.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last() ?? _accessor.HttpContext.Request.Headers["X-Token"].FirstOrDefault() ?? _accessor.HttpContext.Request.Query["Token"].FirstOrDefault() ?? _accessor.HttpContext.Request.Cookies["Token"]; // token校验 var jwtHandler = new JwtSecurityTokenHandler(); var userInfo = new UserInfo(); if (!token.IsNullOrEmpty() && jwtHandler.CanReadToken(token)) { JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(token); var UserId = jwtToken.Claims.First().Value; // userInfo = db.Queryable() // .Where(a => // a.Deleted == false && a.Id == user.Id) // .Select(a => new UserInfo // { // UserId = a.Id, UserCode = a.UserCode, UserName = a.NickName, // // CompanyId = a.CompanyId.ToString(), CompanyName = a.CustomerName // }).First(); // var t1 = JsonConvert.DeserializeObject(temp); userInfo = JsonConvert.DeserializeObject(jwtToken.Claims.First().Value) ; } return userInfo; } public IEnumerable GetClaimsIdentity() { 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; } public List GetClaimValueByType(string ClaimType) { return (from item in GetClaimsIdentity() where item.Type == ClaimType select item.Value).ToList(); } }