123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- using Azure.Cosmos;
- using Microsoft.AspNetCore.Http;
- using Microsoft.Extensions.Logging;
- using StackExchange.Redis;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using TEAMModelOS.Models;
- using TEAMModelOS.SDK.DI;
- using TEAMModelOS.SDK.Models.Table;
- using static TEAMModelOS.SDK.Models.Teacher;
- namespace TEAMModelOS.SDK.Models.Service
- {
- public static class LoginService
- {
- /// <summary>
- /// //添加用户登录信息和在线登录
- /// </summary>
- /// <param name="school">学校</param>
- /// <param name="scope">登录类型Teacher Student TmdUser</param>
- /// <param name="id">登录者的ID</param>
- /// <param name="ip">登陆者的IP地址</param>
- /// <param name="_azureRedis">redis</param>
- /// <param name="_azureStorage">table表</param>
- /// <param name="client">cosmosDB数据库连接</param>
- /// <param name="expire">到期时间</param>
- /// <param name="region">上次登录地址</param>
- /// <returns></returns>
- public static async Task<List<LoginInfo>> DoLoginInfo(List<LoginInfo> loginInfos, string school, string scope, string id, string ip, AzureRedisFactory _azureRedis, AzureStorageFactory _azureStorage, CosmosClient client ,int expire =1, string region = null)
- {
- var table = _azureStorage.GetCloudTableClient().GetTableReference("IESLogin");
- DateTimeOffset dateTime = DateTimeOffset.UtcNow;
- var dateHour = dateTime.ToString("yyyyMMddHH"); //获取当天的小时
- var dateDay = dateTime.ToString("yyyyMMdd"); //获取当天的日期
- var dateMonth = dateTime.ToString("yyyyMM");//获取当月的日期
- var currentHour = dateTime.Hour;
- var currentDay = dateTime.Day;
- long Expire = dateTime.AddHours(expire).ToUnixTimeMilliseconds(); //token到期时间
- long now = dateTime.ToUnixTimeMilliseconds(); //时间戳
-
- DateTime hour = DateTime.UtcNow.AddHours(25); //25小时到期
- DateTime month = DateTime.UtcNow.AddDays(32); //一个月到期
- if (loginInfos.Any())
- {
- if (loginInfos.Count() >= 5)
- {
- loginInfos = loginInfos.OrderBy(x => x.expire).ToList();
- loginInfos.RemoveRange(4, loginInfos.Count() - 4);
- }
- loginInfos.Add(new LoginInfo { expire = Expire, ip = ip, time = now });
- }
- else
- loginInfos = new List<LoginInfo> { new LoginInfo { expire = Expire, ip = ip, time = now } };
-
- if (!string.IsNullOrWhiteSpace(school))
- {
- await _azureRedis.GetRedisClient(8).SortedSetIncrementAsync($"Login:School:{school}:{scope}:{dateDay}", $"{currentHour}", 1);//当天当前小时在线人加1
- await _azureRedis.GetRedisClient(8).SortedSetIncrementAsync($"Login:School:{school}:{scope}:{dateMonth}", $"{currentDay}", 1); //当天的在线加1
- var resDay = await _azureRedis.GetRedisClient(8).KeyTimeToLiveAsync($"Login:School:{school}:{scope}:{dateDay}");
- if (resDay == null)
- {
- await _azureRedis.GetRedisClient(8).KeyExpireAsync($"Login:School:{school}:{scope}:{dateDay}", hour); //设置到期时间
- }
- var rspMonth = await _azureRedis.GetRedisClient(8).KeyTimeToLiveAsync($"Login:School:{school}:{scope}:{dateMonth}");
- if (rspMonth != null)
- {
- await _azureRedis.GetRedisClient(8).KeyExpireAsync($"Login:School:{school}:{scope}:{dateMonth}", month); //设置到期时间
- }
- var scDay = _azureRedis.GetRedisClient(8).SortedSetRangeByScoreWithScores($"Login:School:{school}:{scope}:{dateDay}");
- List<dynamic> scDayCount = new();
- if (scDay != null && scDay.Length > 0)
- {
- foreach (var count in scDay)
- {
- scDayCount.Add(new { code = count.Element.ToString(), count = (int)count.Score });
- }
- }
- //学校小时峰值
- HourLoginSchool hourLoginSc = new() { PartitionKey = $"HourLogin-{school}", RowKey = now.ToString(), Hour = int.Parse(dateHour), School = school };
- if (scope.Equals("teacher"))
- {
- hourLoginSc.Teacher = int.Parse(id);
- hourLoginSc.Student = 0;
- }
- else if (scope.Equals("student"))
- {
- hourLoginSc.Teacher = 0;
- hourLoginSc.Student = int.Parse(id);
- }
- try
- {
- await table.SaveOrUpdate<HourLoginSchool>(hourLoginSc);//保存在线数据
- }
- catch
- {
- }
- var ScMonth = _azureRedis.GetRedisClient(8).SortedSetRangeByScoreWithScores($"Login:School:{school}:{scope}:{dateMonth}");
- List<dynamic> scMonthCount = new();
- if (ScMonth != null && ScMonth.Length > 0)
- {
- foreach (var count in ScMonth)
- {
- scMonthCount.Add(new { code = count.Element.ToString(), count = (int)count.Score });
- }
- }
- //学校天峰值
- DayLoginSchool dayLoginSc = new() { PartitionKey = $"DayLogin-{school}", RowKey = now.ToString(), Day = int.Parse(dateDay), School = school };
- if (scope.Equals("teacher"))
- {
- dayLoginSc.Teacher = int.Parse(id);
- dayLoginSc.Student = 0;
- }
- else if (scope.Equals("student"))
- {
- dayLoginSc.Teacher = 0;
- dayLoginSc.Student = int.Parse(id);
- }
- try
- {
- await table.SaveOrUpdate<DayLoginSchool>(dayLoginSc);//保存在线数据
- }
- catch
- {
- }
- }
- else
- {
- await _azureRedis.GetRedisClient(8).SortedSetIncrementAsync($"Login:IES:{scope}:{dateDay}", $"{currentHour}", 1);//一天24小时
- await _azureRedis.GetRedisClient(8).SortedSetIncrementAsync($"Login:IES:{scope}:{dateMonth}", $"{currentDay}", 1); //当天的累计
- var resDay = await _azureRedis.GetRedisClient(8).KeyTimeToLiveAsync($"Login:IES:{scope}:{dateDay}");
- if (resDay == null)
- {
- await _azureRedis.GetRedisClient(8).KeyExpireAsync($"Login:IES:{scope}:{dateDay}", hour); //设置到期时间
- }
- var rspMonth = await _azureRedis.GetRedisClient(8).KeyTimeToLiveAsync($"Login:IES:{scope}:{dateMonth}");
- if (rspMonth == null)
- {
- await _azureRedis.GetRedisClient(8).KeyExpireAsync($"Login:IES:{scope}:{dateMonth}", month); //设置到期时间
- }
- var scDay = _azureRedis.GetRedisClient(8).SortedSetRangeByScoreWithScores($"Login:IES:{scope}:{dateDay}");
- List<dynamic> scDayCount = new();
- if (scDay != null && scDay.Length > 0)
- {
- foreach (var count in scDay)
- {
- scDayCount.Add(new { code = count.Element.ToString(), count = (int)count.Score });
- }
- }
- var ScMonth = _azureRedis.GetRedisClient(8).SortedSetRangeByScoreWithScores($"Login:IES:{scope}:{dateMonth}");
- List<dynamic> scMonthCount = new();
- if (ScMonth != null && ScMonth.Length > 0)
- {
- foreach (var count in ScMonth)
- {
- scMonthCount.Add(new { code = count.Element.ToString(), count = (int)count.Score });
- }
- }
- //个人或者TMDuser小时峰值
- HourLogin hourLogin = new() { PartitionKey = $"HourLogin", RowKey = now.ToString(), Hour = int.Parse(dateHour) };
- if (scope.Equals("teacher"))
- {
- hourLogin.Teacher = int.Parse(id);
- hourLogin.Student = 0;
- hourLogin.TmdUser = 0;
- }
- else if (scope.Equals("student"))
- {
- hourLogin.Teacher = 0;
- hourLogin.Student = int.Parse(id);
- hourLogin.TmdUser = 0;
- }
- else
- {
- hourLogin.Teacher = 0;
- hourLogin.Student = 0;
- hourLogin.TmdUser = int.Parse(id);
- }
- try
- {
- await table.SaveOrUpdate<HourLogin>(hourLogin);//保存在线数据
- }
- catch
- {
- }
- //个人或者TMDuser天峰值
- DayLogin dayLogin = new() { PartitionKey = $"DayLogin", RowKey = now.ToString(), Day = int.Parse(dateDay) };
- if (scope.Equals("teacher"))
- {
- dayLogin.Teacher = int.Parse(id);
- dayLogin.Student = 0;
- dayLogin.TmdUser = 0;
- }
- else if (scope.Equals("student"))
- {
- dayLogin.Teacher = 0;
- dayLogin.Student = int.Parse(id);
- dayLogin.TmdUser = 0;
- }
- else
- {
- dayLogin.Teacher = 0;
- dayLogin.Student = 0;
- dayLogin.TmdUser = int.Parse(id);
- }
- await table.SaveOrUpdate<DayLogin>(dayLogin);//保存在线数据
- }
- return loginInfos;
- }
- public static async Task<(string ip, string region)> LoginIp(HttpContext httpContext, IPSearcher _searcher)
- {
- var IpPort = httpContext.Request.Headers["X-Forwarded-For"].FirstOrDefault();
- if (string.IsNullOrEmpty(IpPort))
- {
- IpPort = httpContext.Connection.RemoteIpAddress.ToString();
- }
- if (IpPort.Contains("::"))
- {
- IpPort = "127.0.0.1";
- }
- string ip = IpPort.Split(":")[0];
- string region = await _searcher.SearchIpAsync(ip);
- return (ip, region);
- }
- public static void LoginLog(HttpContext httpContext, Option _option, ILogger _logger, DingDing _dingDing, string ip, string region, string id, string name, int status)
- {
- httpContext.Request.Headers.TryGetValue("referer", out var referer);
- httpContext.Request.Headers.TryGetValue("sec-ch-ua", out var chua);
- httpContext.Request.Headers.TryGetValue("sec-ch-ua-platform", out var platform);
- httpContext.Request.Headers.TryGetValue("user-agent", out var useragent);
- if (status == 200)
- {
- string msg = $"{_option.Location} -- {name}({id}):Login Succeed! --Time:{DateTimeOffset.UtcNow.ToString("yyyy-MM-dd HH:mm:ss")} " +
- $"--Browser Info( --referer:{referer} --sec-ch-ua:{chua} --sec-ch-ua-platform:{platform} --user-agent:{useragent} --ip:{ip} --region:{region} )";
- _logger.LogInformation(msg);
- }
- else
- {
- string msg = $"{_option.Location} -- {name}({id}):Login Failed! --Time:{DateTimeOffset.UtcNow.ToString("yyyy-MM-dd HH:mm:ss")} " +
- $"--Browser Info( --referer:{referer} --sec-ch-ua:{chua} --sec-ch-ua-platform:{platform} --user-agent:{useragent} --ip:{ip} --region:{region} )";
- _ = _dingDing.SendBotMsg($"IES5,{_option.Location},{msg}", GroupNames.醍摩豆服務運維群組);
- _logger.LogError(msg);
- }
- }
- }
- }
|