using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Authentication; using System.Security.Claims; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Authorization; using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Logging; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Text; using ViewModels; using Microsoft.Extensions.Configuration; using System; using System.Linq; using ViewModels.RequestData; using ViewModels.ResponseData; using WebAPIServer.Extensions; using WebAPIServer.Models; using System.Net; using Newtonsoft.Json.Linq; using Newtonsoft.Json; using RestSharp; using UAParser; using UAParser.Objects; using NLog; namespace WebAPIServer.Controllers { [Route("api/[controller]/[action]")] [ApiController] public class LoginController : ControllerBase { public IConfiguration? configuration { get; set; } public LoginController(IConfiguration _configuration) { configuration = _configuration; } [Authorize()] [HttpPost()] public ReturnInfo TokenXuQi() { ReturnInfo r = new ReturnInfo(); r.isok = false; try { var claims = HttpContext.AuthenticateAsync().Result?.Principal?.Claims; if (claims != null && claims.Any()) { var Name = claims.SingleOrDefault(A => A.Type == ClaimTypes.Name)?.Value; var UUU = claims.SingleOrDefault(A => A.Type == ClaimTypes.Role)?.Value; var TTT = claims.SingleOrDefault(A => A.Type == ClaimTypes.NameIdentifier)?.Value; TblUtsManageUser? HH = new TblUtsManageUser(); int a = 0; int.TryParse(TTT, out a); HH.Id = a; bool bl = false; bool.TryParse(UUU, out bl); HH.IsAdmin = bl; HH.UserName = Name; string TokenStr = GetToken(HH); r.isok = true; r.response = TokenStr; } } catch (Exception ex) { r.isok = false; r.message = ex.Message; } return r; //var identity = HttpContext.User.Identity as ClaimsIdentity; //if (identity != null) //{ // var userClaims = identity.Claims; //} //return "hello world"; } [HttpGet()] // 例如,一个获取验证码的API端点 public IActionResult GetCaptcha() { string captchaText; // 这里使用上面任一版本的GenerateCaptchaImage方法生成的文本。例如:captchaText = CaptchaHelperSkiaSharp.GenerateCaptchaImage(out captchaText); 或 captchaText = CaptchaHelper.GenerateCaptchaImage(out captchaText); 根据你的选择。 byte[] imageBytes = CaptchaHelperSkiaSharp.GenerateCaptchaImage(); // 或者使用System.Drawing的方法。确保你选择了 return Ok(new { CaptchaText = "1111", Image = Convert.ToBase64String(imageBytes) }); } /// /// 登录 /// /// 用户名 /// 密码 /// [HttpPost] public ReturnInfo Login([FromBody] LoginData data) { ReturnInfo res = new ReturnInfo(); try { string password = data.password; string username = data.username; TblUtsManageUser? entity = null; string TokenString = ""; string pwd = password.ToMD5().ToMD5(); using (var q = new UtsManageContext()) { entity = q.TblUtsManageUsers.SingleOrDefault(A => A.UserName.Equals(username) && A.Password.Equals(pwd)); if (entity != null) { TokenString = GetToken(entity); res.isok = true; ResLoginData r = new ResLoginData(); r.AccessToken = TokenString; r.IsAdmin = entity.IsAdmin; r.ID = entity.Id; r.UserName = entity.UserName; res.response = r; } else { res.isok = false; res.message = "用户名或密码错误"; } } } catch (Exception ex) { res.message = ex.Message; res.isok = false; } return res; } private string GetToken(TblUtsManageUser? entity) { string TokenString; var claims = new Claim[] { new Claim(ClaimTypes.NameIdentifier, entity.Id.ToString()), new Claim(ClaimTypes.Role, entity.IsAdmin.ToString()), new Claim(ClaimTypes.Name, entity.UserName) }; var secretByte = Encoding.UTF8.GetBytes(configuration["JwT:SecretKey"]); var signingKey = new SymmetricSecurityKey(secretByte); var a = SecurityAlgorithms.HmacSha256; var signingCredentials = new SigningCredentials(signingKey, a); var token = new JwtSecurityToken( issuer: configuration["JwT:Issuer"], audience: configuration["JwT:Audience"],//接收 claims: claims,//存放的用户信息 notBefore: DateTime.UtcNow,//发布时间 expires: DateTime.UtcNow.AddDays(3),//过期时间 signingCredentials: signingCredentials //有效期设置为1天signingCredentials //数字名 ); TokenString = new JwtSecurityTokenHandler().WriteToken(token); return TokenString; } public class LLLG { public string UserName { get; set; } public string Database { get; set; } } private readonly Logger _logger = LogManager.GetCurrentClassLogger(); [Authorize()] [HttpPost()] public ReturnInfo LogRecord([FromBody] LLLG data) { ReturnInfo res = new ReturnInfo(); try { string Device = "Unknown"; #region 记录登录信息 var userAgent = Request.Headers["User-Agent"].ToString(); bool _windows = userAgent.Contains("Windows NT"), _mac = userAgent.Contains("Macintosh"), _iphone = userAgent.Contains("iPhone"), _android = userAgent.Contains("Android") ; if (_windows) { Device = "windows"; } else if (_mac) { Device = "Mac"; } else if (_iphone) { Device = "ios"; } else if (_android) { Device = "Android"; } else { Device = "未知"; } #endregion //获得IP string? ip = string.Empty; string? NNN = HttpContext?.Request?.HttpContext?.Connection?.RemoteIpAddress?.ToString(); if (string.IsNullOrEmpty(NNN)) { ip = HttpContext?.Request.Headers["HTTP_X_FORWARDED_FOR"]; } else { ip = NNN; } var uaParser = Parser.GetDefault(); ClientInfo c = uaParser.Parse(userAgent); using (var q = new UtsManageContext()) { TblUtsUseroperation t = new TblUtsUseroperation(); t.CreationTime = DateTime.Now; t.UserName = data.UserName; t.Ip = ip; t.Browser = c.Browser.Family + " " + c.Browser.Major + "." + c.Browser.Minor; t.Operation = "登录"; t.Database = data.Database; t.Device = Device; if (ip.Equals("::1")) { t.Location = "本地"; } else { t.Location = GetBaiduIp(ip); } q.TblUtsUseroperations.Add(t); q.SaveChanges(); res.isok = true; res.response = "sucess"; } } catch (Exception ex) { _logger.Error(ex.Message); res.isok = false; res.response = ex.Message; } return res; } public static void UserLog(string Openration, string Device) { } [HttpPost()] [Authorize()] public string Helloooo() { return "hello"; } [HttpGet()] public string AccessDenied() { return "aaaa"; } /// /// 百度api /// /// public static string GetBaiduIp(string ip) { string location = ""; try { string url = $"https://sp0.baidu.com"; //WebClient client = new WebClient(); RestSharp.RestClient client1 = new RestSharp.RestClient(url); RestSharp.RestRequest request = new RestSharp.RestRequest($"/8aQDcjqpAAV3otqbppnN2DJv/api.php?query={ip}&co=&resource_id=6006&oe=utf8", Method.Get); var buffer = client1.DownloadData(request); //var buffer = client.DownloadData(url); string jsonText = Encoding.UTF8.GetString(buffer); JObject jo = JObject.Parse(jsonText); Root root = JsonConvert.DeserializeObject(jo.ToString()); foreach (var item in root.data) { location = item.location; } return location; } catch (Exception ex) { //Console.WriteLine(ex); return location; } } } public class Root { public List data { get; set; } } public class DataItem { /// /// /// public string ExtendedLocation { get; set; } /// /// /// public string OriginQuery { get; set; } /// /// /// public string appinfo { get; set; } /// /// /// public int disp_type { get; set; } /// /// /// public string fetchkey { get; set; } /// /// 本地局域网 /// public string location { get; set; } /// /// /// public string origip { get; set; } /// /// /// public string origipquery { get; set; } /// /// /// public string resourceid { get; set; } /// /// /// public int role_id { get; set; } /// /// /// public int shareImage { get; set; } /// /// /// public int showLikeShare { get; set; } /// /// /// public string showlamp { get; set; } /// /// IP地址查询 /// public string titlecont { get; set; } /// /// /// public string tplt { get; set; } } }