using Infrastructure; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Http; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Text.RegularExpressions; using System.Threading.Tasks; using UAParser; using ZR.Model.System; namespace ZR.Admin.WebApi.Extensions { /// /// HttpContext扩展类 /// public static class HttpContextExtension { /// /// 是否是ajax请求 /// /// /// public static bool IsAjaxRequest(this HttpRequest request) { if (request == null) { throw new ArgumentNullException(nameof(request)); } //return request.Headers.ContainsKey("X-Requested-With") && // request.Headers["X-Requested-With"].Equals("XMLHttpRequest"); return request.Headers["X-Requested-With"] == "XMLHttpRequest" || (request.Headers != null && request.Headers["X-Requested-With"] == "XMLHttpRequest"); } /// /// 获取客户端IP /// /// /// public static string GetClientUserIp(this HttpContext context) { if (context == null) return ""; var result = context.Request.Headers["X-Forwarded-For"].FirstOrDefault(); if (string.IsNullOrEmpty(result)) { result = context.Connection.RemoteIpAddress.ToString(); } if (string.IsNullOrEmpty(result) || result.Contains("::1")) result = "127.0.0.1"; result = result.Replace("::ffff:", "127.0.0.1"); result = IsIP(result) ? result : "127.0.0.1"; return result; } public static bool IsIP(string ip) { 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?)$"); } public static long GetUId(this HttpContext context) { var uid = context.User.FindFirstValue(ClaimTypes.PrimarySid); return !string.IsNullOrEmpty(uid) ? long.Parse(uid) : 0 ; } public static string GetName(this HttpContext context) { var uid = context.User?.Identity?.Name; return uid; } //public static int GetRole(this HttpContext context) //{ // var roleid = context.User.FindFirstValue(ClaimTypes.Role) ?? "0"; // return int.Parse(roleid); //} public static string GetUserAgent(this HttpContext context) { var str = context.Request.Headers["User-Agent"]; return str; } /// /// 获取请求令牌 /// /// /// public static string GetToken(this HttpContext context) { var str = context.Request.Headers["Token"]; return str; } public static ClientInfo GetClientInfo(this HttpContext context) { var str = GetUserAgent(context); var uaParser = Parser.GetDefault(); ClientInfo c = uaParser.Parse(str); return c; } public static string GetRequestUrl(this HttpContext context) { return context != null ? context.Request.Path.Value : ""; } /// /// 登录cookie写入 /// /// /// /// public static List WriteCookies(this HttpContext context, LoginUser user) { //1、创建Cookie保存用户信息,使用claim var claims = new List() { new Claim(ClaimTypes.PrimarySid, user.UserId.ToString()), new Claim(ClaimTypes.Name, user.UserName), new Claim(ClaimTypes.UserData, JsonConvert.SerializeObject(user)) }; if (user.RoleIds != null) { claims.Add(new Claim(ClaimTypes.Role, string.Join(",", user.RoleIds))); } if (user.Permissions != null) { claims.Add(new Claim("perm", string.Join(",", user.Permissions))); } //2.创建声明主题 指定认证方式 这里使用cookie var claimsIdentity = new ClaimsIdentity(claims, "Login"); Task.Run(async () => { await context.SignInAsync( CookieAuthenticationDefaults.AuthenticationScheme,//这里要注意的是HttpContext.SignInAsync(AuthenticationType,…) 所设置的Scheme一定要与前面的配置一样,这样对应的登录授权才会生效。 new ClaimsPrincipal(claimsIdentity), new AuthenticationProperties() { IsPersistent = true, AllowRefresh = true, ExpiresUtc = DateTimeOffset.Now.AddDays(1),//有效时间 }); }).Wait(); return claims; } } }