396 lines
12 KiB
C#
396 lines
12 KiB
C#
|
|
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; }
|
|||
|
|
}
|
|||
|
|
}
|