using DS.Module.Core.Extensions; using Microsoft.AspNetCore.Http; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; namespace DS.Module.UserModule; public class AspNetUser : IUser { private readonly IHttpContextAccessor _accessor; public AspNetUser(IHttpContextAccessor accessor) { _accessor = accessor; } public string UserId => GetClaimValueByType("jti") ?? "90001"; public string UserName => GetClaimValueByType("UserName") ?? "IUser获取UserName意外为空"; public string TenantId => GetClaimValueByType("TenantId") ?? "90002"; public string TenantName => GetClaimValueByType("TenantName") ?? "IUser获取TenantName意外为空"; public long OrgId => GetClaimValueByType("OrgId")?.ObjToLong() ?? 90003; public string? GetClaimValueByType(string claimType) { return Claims.Where(x => x.Type == claimType).Select(x => x.Value).FirstOrDefault(); } private List? _claims; public List Claims { get { if (_claims == null || _claims.Count == 0) { _claims = GetClaimsIdentity().ToList(); } return _claims; } } IEnumerable GetClaimsIdentity() { if (_accessor.HttpContext == null) return ArraySegment.Empty; if (!IsAuthenticated()) { var token = GetToken(); var jwtHandler = new JwtSecurityTokenHandler(); if (token.IsNotEmptyOrNull() && jwtHandler.CanReadToken(token)) { JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(token); return jwtToken.Claims; } } var claims = _accessor.HttpContext.User.Claims.ToList() ?? []; // 如果有从Claims中获取HttpHeader的需求,把这里放开 //var headers = _accessor.HttpContext.Request.Headers; //foreach (var header in headers) //{ // claims.Add(new Claim(header.Key, header.Value)); //} return claims; } public bool IsAuthenticated() { return _accessor.HttpContext?.User?.Identity?.IsAuthenticated ?? false; } public string GetToken() { var token = _accessor.HttpContext?.Request?.Headers["Authorization"].ObjToString().Replace("Bearer ", ""); if (!string.IsNullOrWhiteSpace(token)) { return token; } return "IUser通过GetToken()获取Token意外为空"; //有需要再返回 //return _accessor.HttpContext?.Request.Headers["X-Token"].FirstOrDefault() // ?? _accessor.HttpContext?.Request.Query["Token"].FirstOrDefault() // ?? _accessor.HttpContext?.Request.Cookies["Token"] // ?? "东胜软件"; } }