You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
2.7 KiB
C#

using System.Net;
using System.Net.Sockets;
using IPTools.Core;
using Microsoft.AspNetCore.Http;
using NPin.Framework.Core.Extensions;
using SqlSugar;
using UAParser;
using Volo.Abp.Auditing;
using Volo.Abp.Domain.Entities;
namespace NPin.Framework.Upms.Domain.Entities;
[SugarTable("SysLoginLog", "登录日志表")]
[SugarIndex($"index_{nameof(LoginUser)}", nameof(LoginUser), OrderByType.Asc)]
public class LoginLogEntity : Entity<Guid>, ICreationAuditedObject
{
[SugarColumn(IsPrimaryKey = true)] public override Guid Id { get; protected set; }
public DateTime CreationTime { get; set; } = DateTime.Now;
public Guid? CreatorId { get; set; }
[SugarColumn(ColumnDescription = "登录用户")]
public string? LoginUser { get; set; }
[SugarColumn(ColumnDescription = "登录用户ID")]
public Guid LoginUserId { get; set; }
[SugarColumn(ColumnDescription = "登录地点")]
public string? LoginLocation { get; set; }
[SugarColumn(ColumnDescription = "Ipv4")]
public string? LoginIpv4 { get; set; }
[SugarColumn(ColumnDescription = "Ipv6")]
public string? LoginIpv6 { get; set; }
[SugarColumn(ColumnDescription = "浏览器")]
public string? Browser { get; set; }
[SugarColumn(ColumnDescription = "操作系统")]
public string? Os { get; set; }
[SugarColumn(ColumnDescription = "登录信息")]
public string? LoginMsg { get; set; }
public static LoginLogEntity GetInfoByHttpContext(HttpContext httpContext)
{
// var ipInfo = httpContext.GetRemoteIpInfo();
string ipv4AddrStr = null;
string ipv6AddrStr = null;
var ipAddr = httpContext.GetClientIpAddress();
if (ipAddr != null)
{
switch (ipAddr.AddressFamily)
{
case AddressFamily.InterNetwork:
ipv4AddrStr = ipAddr.ToString();
break;
case AddressFamily.InterNetworkV6:
ipv6AddrStr = ipAddr.ToString();
break;
}
}
var location = IPAddress.IsLoopback(ipAddr)
? new IpInfo { Province = "本地", City = "本机" }
: IpTool.Search(ipAddr.ToString());
var clientInfo = GetClientInfo(httpContext);
return new LoginLogEntity
{
Browser = clientInfo.Device.Family,
Os = clientInfo.OS.ToString(),
LoginIpv4 = ipv4AddrStr,
LoginIpv6 = ipv6AddrStr,
LoginLocation = $"{location.Country}-{location.Province}-{location.City}"
};
ClientInfo GetClientInfo(HttpContext ctx) => Parser.GetDefault().Parse(ctx.GetUserAgent());
}
}