Files
Web_AUTS_New_Prod/WebAPIServer/Controllers/LoginController.cs
2025-11-20 14:08:17 +08:00

396 lines
12 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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) });
}
/// <summary>
/// 登录
/// </summary>
/// <param name="username">用户名</param>
/// <param name="password">密码</param>
/// <returns></returns>
[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";
}
/// <summary>
/// 百度api
/// </summary>
/// <returns></returns>
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<Root>(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<DataItem> data { get; set; }
}
public class DataItem
{
/// <summary>
///
/// </summary>
public string ExtendedLocation { get; set; }
/// <summary>
///
/// </summary>
public string OriginQuery { get; set; }
/// <summary>
///
/// </summary>
public string appinfo { get; set; }
/// <summary>
///
/// </summary>
public int disp_type { get; set; }
/// <summary>
///
/// </summary>
public string fetchkey { get; set; }
/// <summary>
/// 本地局域网
/// </summary>
public string location { get; set; }
/// <summary>
///
/// </summary>
public string origip { get; set; }
/// <summary>
///
/// </summary>
public string origipquery { get; set; }
/// <summary>
///
/// </summary>
public string resourceid { get; set; }
/// <summary>
///
/// </summary>
public int role_id { get; set; }
/// <summary>
///
/// </summary>
public int shareImage { get; set; }
/// <summary>
///
/// </summary>
public int showLikeShare { get; set; }
/// <summary>
///
/// </summary>
public string showlamp { get; set; }
/// <summary>
/// IP地址查询
/// </summary>
public string titlecont { get; set; }
/// <summary>
///
/// </summary>
public string tplt { get; set; }
}
}