HttpContextExtension.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. using Infrastructure.Model;
  2. using Microsoft.AspNetCore.Http;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Security.Claims;
  8. using System.Text;
  9. using System.Text.RegularExpressions;
  10. using System.Threading.Tasks;
  11. using UAParser;
  12. using ZR.Common;
  13. using ZR.Infrastructure.IPTools;
  14. namespace Infrastructure.Extensions
  15. {
  16. /// <summary>
  17. /// HttpContext扩展类
  18. /// </summary>
  19. public static partial class HttpContextExtension
  20. {
  21. /// <summary>
  22. /// 是否是ajax请求
  23. /// </summary>
  24. /// <param name="request"></param>
  25. /// <returns></returns>
  26. public static bool IsAjaxRequest(this HttpRequest request)
  27. {
  28. if (request == null)
  29. {
  30. throw new ArgumentNullException(nameof(request));
  31. }
  32. //return request.Headers.ContainsKey("X-Requested-With") &&
  33. // request.Headers["X-Requested-With"].Equals("XMLHttpRequest");
  34. return request.Headers["X-Requested-With"] == "XMLHttpRequest" || request.Headers != null && request.Headers["X-Requested-With"] == "XMLHttpRequest";
  35. }
  36. /// <summary>
  37. /// 获取客户端IP
  38. /// </summary>
  39. /// <param name="context"></param>
  40. /// <returns></returns>
  41. public static string GetClientUserIp(this HttpContext context)
  42. {
  43. if (context == null) return "";
  44. var result = context.Request.Headers["X-Forwarded-For"].FirstOrDefault();
  45. if (string.IsNullOrEmpty(result))
  46. {
  47. result = context.Connection.RemoteIpAddress?.ToString();
  48. }
  49. if (string.IsNullOrEmpty(result))
  50. throw new Exception("获取IP失败");
  51. if (result.Contains("::1"))
  52. result = "127.0.0.1";
  53. result = result.Replace("::ffff:", "");
  54. result = result.Split(':')?.FirstOrDefault() ?? "127.0.0.1";
  55. result = IsIP(result) ? result : "127.0.0.1";
  56. return result;
  57. }
  58. /// <summary>
  59. /// 判断是否IP
  60. /// </summary>
  61. /// <param name="ip"></param>
  62. /// <returns></returns>
  63. public static bool IsIP(string ip)
  64. {
  65. return Regex.IsMatch(ip, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$");
  66. }
  67. /// <summary>
  68. /// 获取登录用户id
  69. /// </summary>
  70. /// <param name="context"></param>
  71. /// <returns></returns>
  72. public static long GetUId(this HttpContext context)
  73. {
  74. var uid = context.User.FindFirstValue(ClaimTypes.PrimarySid);
  75. return !string.IsNullOrEmpty(uid) ? long.Parse(uid) : 0;
  76. }
  77. /// <summary>
  78. /// 获取部门id
  79. /// </summary>
  80. /// <param name="context"></param>
  81. /// <returns></returns>
  82. public static long GetDeptId(this HttpContext context)
  83. {
  84. var deptId = context.User.FindFirstValue(ClaimTypes.GroupSid);
  85. return !string.IsNullOrEmpty(deptId) ? long.Parse(deptId) : 0;
  86. }
  87. /// <summary>
  88. /// 获取登录用户名
  89. /// </summary>
  90. /// <param name="context"></param>
  91. /// <returns></returns>
  92. public static string GetName(this HttpContext context)
  93. {
  94. var uid = context.User?.Identity?.Name;
  95. return uid;
  96. }
  97. /// <summary>
  98. /// 判断是否是管理员
  99. /// </summary>
  100. /// <param name="context"></param>
  101. /// <returns></returns>
  102. public static bool IsAdmin(this HttpContext context)
  103. {
  104. var userName = context.GetName();
  105. return userName == GlobalConstant.AdminRole;
  106. }
  107. /// <summary>
  108. /// ClaimsIdentity
  109. /// </summary>
  110. /// <param name="context"></param>
  111. /// <returns></returns>
  112. public static IEnumerable<ClaimsIdentity> GetClaims(this HttpContext context)
  113. {
  114. return context.User?.Identities;
  115. }
  116. //public static int GetRole(this HttpContext context)
  117. //{
  118. // var roleid = context.User.FindFirstValue(ClaimTypes.Role) ?? "0";
  119. // return int.Parse(roleid);
  120. //}
  121. public static string GetUserAgent(this HttpContext context)
  122. {
  123. return context.Request.Headers["User-Agent"];
  124. }
  125. /// <summary>
  126. /// 获取请求令牌
  127. /// </summary>
  128. /// <param name="context"></param>
  129. /// <returns></returns>
  130. public static string GetToken(this HttpContext context)
  131. {
  132. return context.Request.Headers["Authorization"];
  133. }
  134. /// <summary>
  135. /// 获取租户ID
  136. /// </summary>
  137. /// <param name="context"></param>
  138. /// <returns></returns>
  139. public static string GetTenantId(this HttpContext context)
  140. {
  141. return context.Request.Headers["tenantId"];
  142. }
  143. /// <summary>
  144. /// 获取请求Url
  145. /// </summary>
  146. /// <param name="context"></param>
  147. /// <returns></returns>
  148. public static string GetRequestUrl(this HttpContext context)
  149. {
  150. return context != null ? context.Request.Path.Value : "";
  151. }
  152. /// <summary>
  153. /// 获取请求参数
  154. /// </summary>
  155. /// <param name="context"></param>
  156. /// <returns></returns>
  157. public static string GetQueryString(this HttpContext context)
  158. {
  159. return context != null ? context.Request.QueryString.Value : "";
  160. }
  161. /// <summary>
  162. /// 获取body请求参数
  163. /// </summary>
  164. /// <param name="context"></param>
  165. /// <returns></returns>
  166. public static string GetBody(this HttpContext context)
  167. {
  168. context.Request.EnableBuffering();
  169. //context.Request.Body.Seek(0, SeekOrigin.Begin);
  170. //using var reader = new StreamReader(context.Request.Body, Encoding.UTF8);
  171. ////需要使用异步方式才能获取
  172. //return reader.ReadToEndAsync().Result;
  173. string body = string.Empty;
  174. var buffer = new MemoryStream();
  175. context.Request.Body.Seek(0, SeekOrigin.Begin);
  176. context.Request.Body.CopyToAsync(buffer);
  177. buffer.Position = 0;
  178. try
  179. {
  180. using StreamReader streamReader = new(buffer, Encoding.UTF8);
  181. body = streamReader.ReadToEndAsync().Result;
  182. }
  183. finally
  184. {
  185. buffer?.Dispose();
  186. }
  187. return body;
  188. }
  189. /// <summary>
  190. /// 获取body请求参数(异步)
  191. /// </summary>
  192. /// <param name="context"></param>
  193. /// <returns></returns>
  194. public static async Task<string> GetBodyAsync(this HttpContext context)
  195. {
  196. // 允许多次读取请求体
  197. context.Request.EnableBuffering();
  198. // 重置请求体流的位置,确保从头读取
  199. context.Request.Body.Position = 0;
  200. // 读取请求体内容
  201. using var reader = new StreamReader(context.Request.Body, Encoding.UTF8, leaveOpen: true);
  202. var body = await reader.ReadToEndAsync();
  203. // 读取完成后将流位置重置为0,确保后续操作可以继续读取
  204. context.Request.Body.Position = 0;
  205. return body;
  206. }
  207. /// <summary>
  208. /// 获取浏览器信息
  209. /// </summary>
  210. /// <param name="context"></param>
  211. /// <returns></returns>
  212. public static ClientInfo GetClientInfo(this HttpContext context)
  213. {
  214. var str = context.GetUserAgent();
  215. var uaParser = Parser.GetDefault();
  216. ClientInfo c = uaParser.Parse(str);
  217. return c;
  218. }
  219. /// <summary>
  220. /// 根据IP获取地理位置
  221. /// </summary>
  222. /// <returns></returns>
  223. public static string GetIpInfo(string IP)
  224. {
  225. var ipInfo = IpTool.Search(IP);
  226. return ipInfo?.Province + "-" + ipInfo?.City + "-" + ipInfo?.NetworkOperator;
  227. }
  228. /// <summary>
  229. /// 设置请求参数
  230. /// </summary>
  231. /// <param name="reqMethod"></param>
  232. /// <param name="context"></param>
  233. public static string GetRequestValue(this HttpContext context, string reqMethod)
  234. {
  235. string param = string.Empty;
  236. if (HttpMethods.IsPost(reqMethod) || HttpMethods.IsPut(reqMethod) || HttpMethods.IsDelete(reqMethod))
  237. {
  238. param = context.GetBody();
  239. string regex = "(?<=\"password\":\")[^\",]*";
  240. param = Regex.Replace(param, regex, "***");
  241. }
  242. if (param.IsEmpty())
  243. {
  244. param = context.GetQueryString();
  245. }
  246. return param;
  247. }
  248. /// <summary>
  249. /// 获取当前用户登录信息
  250. /// </summary>
  251. /// <param name="context"></param>
  252. /// <returns></returns>
  253. public static TokenModel GetCurrentUser(this HttpContext context)
  254. {
  255. var tokenModel = JwtUtil.GetLoginUser(context);
  256. if (tokenModel != null)
  257. {
  258. tokenModel.Permissions = (List<string>)CacheHelper.GetCache(GlobalConstant.UserPermKEY + tokenModel.UserId);
  259. }
  260. return tokenModel;
  261. }
  262. /// <summary>
  263. /// 是否有敏感数据权限
  264. /// </summary>
  265. /// <param name="context"></param>
  266. /// <param name="perm"></param>
  267. /// <returns></returns>
  268. public static bool HasSensitivePerm(this HttpContext context, string perm)
  269. {
  270. if (IsAdmin(context)) return true;
  271. var perms = context.User?.FindFirst("sensitivePerms")?.Value?.Split(',') ?? [];
  272. return perms.Contains(perm);
  273. }
  274. }
  275. }